Запретить браузеру преобразовывать '\ n' между строками в пробел (для китайских символов) - PullRequest
14 голосов
/ 18 декабря 2011

Преобразование новой строки в пробел имеет смысл для английского языка, например, следующий HTML

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

После преобразования новой строки в пробел в браузере мы получаем следующее:

This is a sentence.

Это хорошо для английского языка, но не хорошо для китайских иероглифов, потому что мы не используем пробелы для разделения слов в китайском . Вот пример (китайское предложение имеет то же значение, что и «Это предложение»):

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

Я получаю следующий результат на Chrome, Safari и IE

这是 一句话。

Что я хотел, так это без лишних пробелов.

这是一句话。

Я не знаю , почему браузер не игнорирует символ новой строки, если последний символ текущей строки и первый символ следующей строки являются китайскими символами (что, я думаю, имеет больше смысла) , Или они предоставили этот механизм, но нуждаются в особой обработке?

Кстати, в Vim при использовании «J» для объединения строк пробел не добавляется, если последний и первый символы в 2 строках - все китайские символы. Но для английского будет добавлено место. Так что я думаю, что Vim специально для этого обрабатывает.

Обновление:

Хотя я думаю, что это проблема с браузером, я должен с этим смириться. Поэтому в настоящее время я должен предварительно обработать текст Markdown, чтобы соединить китайские строки перед генерацией HTML. Вот как я делаю это в Ruby, полный код, который также обрабатывает знаки препинания на китайском, находится на 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

Ответы [ 4 ]

9 голосов
/ 18 декабря 2011

Браузеры обрабатывают переводы строк как пробелы, потому что в спецификациях так сказано, начиная с HTML 2.0. На самом деле, HTML 2.0 был мягче, чем более поздние спецификации; в нем говорилось: «Пользовательский агент HTML должен рассматривать конец строки в любом из ее вариантов как пространство слов во всех контекстах, кроме предварительно отформатированного текста». ( Условное представление новых строк ), тогда как в более новых спецификациях это звучит сильнее ( описывая это как то, что происходит в HTML).

Предпосылкой является то, что HTML и Интернет были разработаны с учетом в основном западноевропейских языков; это отражено во многих особенностях оригинальных спецификаций и ранних реализаций. Медленно они были интернационализированы.

Маловероятно, что правила синтаксического анализа будут изменены. Скорее всего, может произойти чувствительность к отображению свойств языка или символов. Это будет означать, что разрыв строки по-прежнему воспринимается как пробел (и строка DOM будет содержать символ пробела Ascii), но строка типа 这 是 一句话。 будет отображаться , как если бы пробела не было , Это то, к чему относится спецификация HTML 4.01 ( Пробел ). Текст несколько сбит с толку, но я думаю, что он пытается сказать, что поведение будет зависеть от языка контента, либо определяется браузером, либо как объявлено в разметке.

Но браузеры пока этого не делают. Объявление языка контента, например, <html lang=zh>, это хороший принцип, но он практически не влияет - при рендеринге это может повлиять на выбор браузером шрифта по умолчанию (но сколько авторов позволяют браузерам использовать свои шрифты по умолчанию?). Это может даже привести к добавленному добавленному интервалу , если символ пробела оказывается шире в шрифте браузера по умолчанию для указанного языка.

Согласно черновому тексту CSS3, вы можете использовать свойство text-spacing. Значение none «Отключает все текстовые функции. Все символы полной ширины установлены с символами полной ширины ». К сожалению, ни один браузер пока не поддерживает это.

4 голосов
/ 04 апреля 2012

Есть способ решить эту проблему (классический обходной путь). Чтобы ограничить (текущие) браузеры интерпретацией переноса строки как пробела, вы должны установить размер шрифта равным 0.

Для дочерних элементов вы должны снова установить начальный размер шрифта. Так что для вашего кода пример будет:

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

CSS может содержать код, подобный следующему:

.nowhitespace { font-size: 0; }
.nowhitespace > span { font-size: 16px; }
2 голосов
/ 02 января 2017

Пока что самый короткий путь, которым я знаю, чтобы достичь эффекта, это сломаться после открывающего тега. Но вы не хотите вставлять дополнительный тег в ваш источник. Было бы хорошо, если бы были какие-то теги, которые ничего не делают. На самом деле, есть один, комментарий.

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

Это дает вам следующее.

这是一句话。

Источник вдохновения: Нет дополнительного пространства

0 голосов
/ 18 декабря 2011

Вы можете использовать <pre> теги для предварительно отформатированного текста, а также вы можете изменить его стиль. Предварительно отформатированный текст будет буквально воспринимать символы новой строки и отображать их как новую строку.

Если не хотите <pre>:

Символ новой строки также считается пробелом. Когда вы вставляете символ новой строки, он будет считать следующую строку частью предыдущей строки и просто заменит этот символ новой строки пробелом.

Вы должны явно объявить новую строку в HTML, просто используйте <br>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...