2011-12-18 6 views
12

Konwersja przełamane w przestrzeń sens dla języka angielskiego, na przykład, następujący kod HTMLPrevent przeglądarka konwersji „ n” między wierszami w przestrzeni (dla chińskich znaków)

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

otrzymujemy następujące po przekształceniu nowej linii do przestrzeń w przeglądarce:

This is a sentence. 

to jest dobre dla języka angielskiego, ale nie jest dobre dla chińskich znaków, ponieważ nie używamy spacji aby rozdzielić słowa w chińskim. Oto przykład (Zdanie chiński ma takie samo znaczenie „To jest zdanie”):

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

otrzymuję następujący wynik na Chrome, Safari i IE

这是 一句话。 

Chciałem jest po, bez dodatkowej przestrzeni.

这是一句话。 

nie wiem czemu przeglądarka nie ignorować przełamane jeśli ostatni znak z aktualnej linii i pierwszy znak następnej linii są zarówno chińskie znaki (co moim zdaniem ma więcej sensu) . Czy zapewnili ten mechanizm, ale wymagają specjalnej obsługi?

Przy okazji, w Vimie, gdy do łączenia linii używa się "J", nie zostanie dodane spacja, jeśli ostatni i pierwszy znak z 2 wierszy to wszystkie chińskie znaki. Ale w przypadku języka angielskiego zostanie dodane miejsce. Sądzę więc, że Vim zajmuje się czymś specjalnym.

Aktualizacja:

Choć myślę, że jest to problem z przeglądarką, muszę z tym żyć. Obecnie przygotowuję mój tekst Markdown do łączenia chińskich linii przed wygenerowaniem kodu HTML. Oto jak zrobić to w Ruby, kompletny kod, który obsługuje również chińskich znaków interpunkcyjnych jest 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

Można zrobić skrypt, aby pliki new-line mniej ze wszystkich plików HTML w katalogu, uruchom ten skrypt za każdym razem masz zamiar opublikować pliki do Internetu i opublikuj pliki wynikowe. – Gravity

+0

Wiem, że można to łatwo rozwiązać za pomocą skryptu. Ale myślę, że przeglądarka powinna sobie z tym poradzić, aby ułatwić życie większości ludzi. Jak widzisz, Vim to robi, aw LaTeX możemy zabronić nowej linii konwersji do przestrzeni. – cyfdecyf

Odpowiedz

8

Przeglądarki traktują znaki nowej linii jako spacje, ponieważ specyfikacje tak mówią, od czasów HTML 2.0. W rzeczywistości HTML 2.0 był łagodniejszy niż późniejsze specyfikacje; napisano: "Agent użytkownika HTML powinien traktować koniec wiersza w dowolnej jego odmianie jako przestrzeń tekstową we wszystkich kontekstach z wyjątkiem tekstu sformatowanego wstępnie". (Conventional Representation of Newlines), podczas gdy nowsze specyfikacje mówią to mocniej (opisując to, co dzieje się w HTML).

Tłem jest to, że HTML i sieć została stworzona z myślą głównie o językach zachodnioeuropejskich; Znajduje to odzwierciedlenie w wielu cechach pierwotnych specyfikacji i wczesnych wdrożeń. Tylko powoli zostały umiędzynarodowione.

Jest mało prawdopodobne, że zasady parsowania zostaną zmienione. Bardziej prawdopodobne, co może się stać, jest wrażliwość na renderowanie języka lub właściwości znaków. Oznaczałoby to, że podział wiersza jest nadal traktowany jako spacja (a ciąg DOM zawiera znak spacji Ascii), ale ciąg taki jak 这 是 一句话. Byłby wyrenderowany, tak jakby nie było tam miejsca. To, do czego odnosi się specyfikacja HTML 4.01 (White space). Tekst jest trochę zagmatwany, ale myślę, że próbuje powiedzieć, że zachowanie będzie zależało od języka treści, wywnioskowanego przez przeglądarkę lub zadeklarowanego w znacznikach.

Ale przeglądarki nie robią jeszcze takich rzeczy. Deklaracja języka treści, np. <html lang=zh>, jest dobrą zasadą, ale ma niewielki wpływ praktyczny na renderowanie, może wpływać na wybór przez przeglądarkę domyślnej czcionki (ale ilu autorów zezwala przeglądarkom na używanie ich domyślnych czcionek?). Może nawet spowodować, że dodaje odstępy, jeśli znak spacji jest szerszy w domyślnej czcionce przeglądarki dla określonego języka.

Zgodnie z wersją roboczą tekstu CSS3, można użyć właściwości text-spacing. Wartość none "Wyłącza wszystkie funkcje odstępów między tekstami. Wszystkie znaki o pełnej szerokości są ustawione z glifami o pełnej szerokości. "Niestety, żadna przeglądarka nie obsługuje tego jeszcze.

-3

Można użyć <pre> tagów dla tekstu sformatowane, a można zmienić jego styl, jak również. Wstępnie sformatowany tekst przyjmuje znaki nowej linii dosłownie i renderuje je jako nową linię.

Jeśli nie chcesz <pre>:

Znak nowego wiersza jest również uważany za spacje. Po wstawieniu znaku nowego wiersza, rozważa on następującą linię część poprzedniego wiersza i po prostu zastępuje znak nowej linii spacją.

Musisz jawnie zadeklarować nową linię w HTML, wystarczy użyć <br>.

+0

Mój problem polega na tym, że znak nowej linii nie powinien być traktowany jako biała przestrzeń podczas posługiwania się chińskimi znakami. Ale przeglądarka nie wymaga specjalnej obsługi dla chińskich znaków. – cyfdecyf

+0

Cóż, nie ma. AFAIK, nie ma elementu HTML ani elementu CSS, aby to naprawić i wątpię, aby taka funkcja istniała w obecnych przeglądarkach. :( –

4

Istnieje sposób na rozwiązanie tego problemu (obejście klasyczne). Aby ograniczyć (obecne) przeglądarki interpretujące podział wierszy jako białe znaki, należy ustawić rozmiar czcionki na 0.

Dla elementów potomnych należy ponownie ustawić rozmiar czcionki na wartość początkową. Tak na kodzie Przykładem może być:

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

CSS może zawierać kod podobny do poniższego:

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

Dzięki, to naprawdę działa.Ale jeden problem z tą sztuczką polega na tym, że muszę zawijać każdą linię zawierającą tekst chiński za pomocą 'span'. Aby było to bardziej skomplikowane, jeśli początkiem/końcem linii jest angielskie słowo, nie powinienem zamykać/otwierać znacznika 'span'. – cyfdecyf

+0

Tak, wiem - więc ogólnie rzecz biorąc musisz jeszcze włączyć funkcję modyfikacji linii, jak ta, którą napisałeś powyżej. Wymyśliłem to obejście w celach projektowych, gdzie przestrzenie zabiły układ. –

0

tej pory najkrótszą drogą znam osiągnąć efekt jest przełamanie po znaczniku otwierającym . Ale nie chcesz wstawiać dodatkowego tagu w swoim źródle. Byłoby miło, gdyby były jakieś znaczniki, które nic nie robią. Właściwie to wychodzi jeden, komentarz.

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

Daje to następujące.

这是一句话。 

źródłem inspiracji: No extra space

Powiązane problemy