将换行符转换为空格对于英语是有意义的,例如,以下HTML
<p>
This is
a sentence.
</p>
Run Code Online (Sandbox Code Playgroud)
在浏览器中将换行符转换为空格后,我们得到以下内容:
This is a sentence.
Run Code Online (Sandbox Code Playgroud)
这对英语有好处,但对汉字不好,因为我们不使用空格来分隔中文单词.这是一个例子(中文句子的含义与"这是一个句子"相同):
<p>
??
????
</p>
Run Code Online (Sandbox Code Playgroud)
我在Chrome,Safari和IE上获得了以下结果
?? ????
Run Code Online (Sandbox Code Playgroud)
我想要的是以下,没有额外的空间.
??????
Run Code Online (Sandbox Code Playgroud)
如果当前行的最后一个字符和下一行的第一个字符都是中文字符(我认为更有意义),我不知道为什么浏览器不会忽略换行符.或者他们提供了这种机制但需要特殊处理?
顺便说一句,在Vim中,当使用"J"连接线时,如果2行的最后一个和第一个字符都是中文字符,则不会添加空格.但对于英语,将增加一个空间.所以我猜Vim为此做了一些特别的处理.
更新:
虽然我认为这是浏览器的一个问题,但我必须接受它.因此,目前我会在生成HTML之前预处理我的Markdown文本以加入中文行.以下是我在Ruby中做到这一点,完整的代码也可以用来处理中国标点符号是要点
#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
Run Code Online (Sandbox Code Playgroud)
浏览器将换行视为空格,因为自HTML 2.0以来规范就是这样说的.事实上,HTML 2.0比后来的规范更温和; 它说:"HTML用户代理应该将其任何变体中的行尾作为所有上下文中的单词空间,除了预先格式化的文本."(Newlines的常规表示),而较新的规范说这更强(将其描述为HTML).
背景是HTML和Web是以西欧语言为主开发的; 这反映在原始规范和早期实现的许多功能中.他们只是慢慢地国际化了.
解析规则不太可能会被更改.更有可能的是,可能发生的是对语言或角色属性渲染的敏感性.这意味着换行仍然被视为一个空格(并且DOM字符串将包含Ascii空格字符),但是像这样一句话的字符串将被渲染,好像空间不存在一样.这就是HTML 4.01规范似乎所指的(白色空间).文本有点混乱,但我认为它试图说行为将取决于内容语言,无论是由浏览器推断还是在标记中声明.
但是浏览器还没有这样做.例如<html lang=zh>,声明内容的语言是一个很好的原则,但在渲染方面几乎没有实际影响,它可能会影响浏览器对默认字体的选择(但有多少作者让浏览器使用其默认字体?).如果空格字符恰好在浏览器指定语言的默认字体中更宽,则甚至可能导致增加间距.
根据CSS3 Text草案,您可以使用该text-spacing属性.值none"关闭所有文本间距功能.所有宽带字符都使用全角字形设置."不幸的是,没有浏览器似乎支持这一点.
有一种方法可以解决这个问题(经典的解决方法)。为了限制(当前)浏览器将换行符解释为空格,您必须将字体大小设置为 0。
对于子元素,您必须再次将 font-size 设置为其初始值。所以对于你的代码,一个例子是:
<p class="nowhitespace">
<span>??</span>
<span>????</span>
</p>
Run Code Online (Sandbox Code Playgroud)
CSS 可能包含如下代码:
.nowhitespace { font-size: 0; }
.nowhitespace > span { font-size: 16px; }
Run Code Online (Sandbox Code Playgroud)