Подтвердить что ты не робот

Запретить преобразование браузера '\n' между строками в космос (для китайских символов)

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

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

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

This is a sentence.

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

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

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

这是 一句话。

Мне нужно следующее, без лишнего места.

这是一句话。

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

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

Update:

Хотя я думаю, что это проблема с браузером, я должен жить с этим. Поэтому в настоящее время я должен предварительно обработать текст 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
4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

CSS может содержать следующий код:

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

Ответ 3

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

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

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

这是一句话。

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

Ответ 4

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

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

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

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