2011-12-18 14 views
12

Chuyển đổi xuống dòng vào không gian có ý nghĩa đối với tiếng Anh, ví dụ, đoạn HTML sautrình duyệt Ngăn chặn chuyển đổi ' n' giữa các dòng vào không gian (đối với chữ Hán)

<p> 
This is 
a sentence. 
</p> 

Chúng tôi nhận được như sau sau khi chuyển đổi các dòng mới vào không gian trong trình duyệt:

This is a sentence. 

này là tốt cho tiếng Anh, nhưng không tốt cho chữ Hán bởi vì chúng tôi không sử dụng không gian để tách từ Trung Quốc. Dưới đây là một ví dụ (Câu Trung Quốc có cùng ý nghĩa của "This is a sentence"):

<p> 
这是 
一句话。 
</p> 

tôi nhận được kết quả sau trên Chrome, Safari và IE

这是 一句话。 

Những gì tôi muốn là sau đây, mà không có thêm không gian.

这是一句话。 

Tôi không biết lý do tại sao trình duyệt không bỏ qua newline nếu ký tự cuối cùng của dòng hiện tại và ký tự đầu tiên của dòng tiếp theo là cả chữ Hán (mà tôi nghĩ rằng ý nghĩa hơn) . Hoặc họ đã cung cấp cơ chế này nhưng cần xử lý đặc biệt?

BTW, trong Vim, khi sử dụng "J" để nối các dòng, không có khoảng trắng sẽ được thêm nếu ký tự cuối cùng và ký tự đầu tiên của 2 dòng là tất cả các ký tự Trung Quốc. Nhưng đối với tiếng Anh, một không gian sẽ được thêm vào. Vì vậy, tôi đoán Vim làm một số xử lý đặc biệt cho việc này.

Cập nhật:

Mặc dù tôi nghĩ rằng đây là một vấn đề với các trình duyệt, tôi phải sống với điều đó. Vì vậy, hiện tại tôi sẽ xử lý trước văn bản Markdown của mình để tham gia các dòng tiếng Trung trước khi tạo HTML. Đây là cách tôi làm điều này trong Ruby, mã hoàn chỉnh mà cũng xử lý punctuations Trung Quốc là trên gist

#encoding: UTF-8 

# Requires ruby 1.9.x, and assume using UTF-8 encoding 

class String 
    # The regular expression trick to match CJK characters comes from 
    # http://stackoverflow.com/a/4681577/306935 
    def join_chinese 
    gsub(/(\p{Han})\n(\p{Han})/m, '\1\2') 
    end 
end 
+0

Bạn có thể làm cho một kịch bản để làm cho tập tin mới-line-ít hơn từ tất cả các file HTML trong một thư mục, chạy mà kịch bản mỗi khi bạn sắp xuất bản các tệp của bạn lên web và xuất bản các tệp kết quả. – Gravity

+0

Tôi biết điều này có thể dễ dàng được giải quyết bằng cách sử dụng tập lệnh. Nhưng tôi nghĩ rằng trình duyệt sẽ xử lý điều này để làm cho cuộc sống của mọi người dễ dàng hơn. Như bạn thấy, Vim làm điều này, và trong LaTeX chúng ta có thể cấm chuyển dòng mới thành dấu cách. – cyfdecyf

Trả lời

8

Trình duyệt coi các dòng mới là khoảng trắng vì các đặc điểm kỹ thuật nói như vậy, kể từ HTML 2.0. Trên thực tế, HTML 2.0 nhẹ hơn các thông số kỹ thuật sau này; Nó cho biết: “Tác nhân người dùng HTML nên xử lý dòng cuối trong bất kỳ biến thể nào của nó dưới dạng không gian từ trong tất cả các ngữ cảnh ngoại trừ văn bản được định dạng trước.” (Conventional Representation of Newlines), trong khi các đặc tả mới hơn mạnh mẽ hơn (mô tả nó như những gì xảy ra trong HTML).

Nền là HTML và Web được phát triển chủ yếu bằng các ngôn ngữ Tây Âu; điều này được phản ánh trong nhiều tính năng của thông số ban đầu và triển khai sớm. Chỉ từ từ họ mới được quốc tế hóa.

Rất có thể quy tắc phân tích cú pháp sẽ không thay đổi. Nhiều khả năng, những gì có thể xảy ra là sự nhạy cảm với ngôn ngữ hoặc các thuộc tính ký tự. Điều này có nghĩa là ngắt dòng vẫn được lấy làm dấu cách (và chuỗi DOM sẽ chứa ký tự khoảng trắng Ascii), nhưng một chuỗi như 这 是 一句话。 sẽ là trả về như thể không có không gian đó. Điều này đặc tả HTML 4.01 dường như ám chỉ đến (White space). Các văn bản là hơi bối rối, nhưng tôi nghĩ rằng nó cố gắng để nói rằng hành vi sẽ phụ thuộc vào ngôn ngữ nội dung, hoặc suy ra bởi trình duyệt hoặc như tuyên bố trong đánh dấu.

Tuy nhiên, trình duyệt vẫn chưa làm những việc như vậy. Khai báo ngôn ngữ của nội dung, ví dụ: <html lang=zh>, là một nguyên tắc tốt nhưng có ít tác động thực tế — trong hiển thị, nó có thể ảnh hưởng đến lựa chọn phông chữ mặc định của trình duyệt (nhưng có bao nhiêu tác giả cho phép trình duyệt sử dụng phông mặc định của họ?). Nó thậm chí có thể dẫn đến việc thêm khoảng cách, nếu ký tự khoảng trắng sẽ rộng hơn trong phông chữ mặc định của trình duyệt cho ngôn ngữ được chỉ định.

Theo bản nháp văn bản CSS3, bạn có thể sử dụng thuộc tính text-spacing. Giá trị none “Tắt tất cả các tính năng giãn cách văn bản. Tất cả các ký tự fullwidth đều được đặt với các hình chữ nhật có độ rộng đầy đủ. ”Thật không may, không có trình duyệt nào hỗ trợ tính năng này.

-3

Bạn có thể sử dụng <pre> thẻ cho văn bản định dạng sẵn và bạn có thể thay đổi đó là phong cách là tốt. Văn bản được định dạng trước sẽ lấy các ký tự dòng mới theo nghĩa đen và hiển thị nó dưới dạng một dòng mới.

Nếu bạn không muốn <pre>:

Newline nhân vật cũng được coi là một khoảng trắng. Khi bạn chèn một ký tự dòng mới, nó sẽ xem xét dòng sau là một phần của dòng trước đó và chỉ cần thay thế ký tự dòng mới đó bằng một dấu cách.

Bạn phải khai báo rõ ràng dòng mới bằng HTML, chỉ cần sử dụng <br>.

+0

Vấn đề của tôi là dòng mới không được coi là khoảng trắng khi xử lý ký tự Trung Quốc. Nhưng trình duyệt không xử lý đặc biệt cho các ký tự Trung Quốc. – cyfdecyf

+0

Vâng, nó không. AFAIK, không có thẻ HTML hoặc phần tử CSS nào để sửa lỗi này và tôi nghi ngờ tính năng này tồn tại trong các trình duyệt hiện tại. :( –

4

Có một cách để giải quyết vấn đề này (giải pháp cổ điển). Để hạn chế các trình duyệt (hiện tại) giải thích ngắt dòng là khoảng trắng, bạn phải đặt kích thước phông chữ là 0.

Đối với các phần tử con, bạn phải đặt kích thước phông chữ về giá trị ban đầu một lần nữa. Vì vậy, đối mã của bạn một ví dụ sẽ là:

<p class="nowhitespace"> 
    <span>这是</span> 
    <span>一句话。</span> 
</p> 

CSS có thể chứa mã như sau:

.nowhitespace { font-size: 0; } 
.nowhitespace > span { font-size: 16px; } 
+0

Cảm ơn, điều này thực sự hiệu quả.Nhưng một vấn đề với thủ thuật này là tôi phải bọc tất cả các dòng có chứa văn bản tiếng Trung với 'span'. Để làm cho mọi thứ trở nên phức tạp hơn, nếu đầu/cuối của một dòng là từ tiếng Anh, thì tôi không nên đóng/mở thẻ 'span'. – cyfdecyf

+0

Vâng tôi biết - vì vậy tổng thể bạn vẫn phải bao gồm một chức năng để sửa đổi các dòng như một trong những bạn đã viết ở trên. Tôi đã đưa ra giải pháp này cho mục đích thiết kế, nơi không gian đã giết bố cục. –

0

Cho đến nay con đường ngắn nhất mà tôi biết để đạt được hiệu quả là để phá vỡ sau khi một thẻ mở . Nhưng bạn không muốn chèn thêm thẻ vào nguồn của mình. Sẽ tốt hơn nếu có một số thẻ không làm gì cả. Trên thực tế, có thoát khỏi một, bình luận.

<p> 
这是<!-- 
-->一句话。 
</p> 

Điều này cung cấp cho bạn những điều sau đây.

这是一句话。 

Nguồn cảm hứng: No extra space

Các vấn đề liên quan