Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 防止浏览器转换'\n';行间空格(用于汉字)_Html_Browser_Cjk - Fatal编程技术网

Html 防止浏览器转换'\n';行间空格(用于汉字)

Html 防止浏览器转换'\n';行间空格(用于汉字),html,browser,cjk,Html,Browser,Cjk,将换行符转换为空格对于英语是有意义的,例如,下面的HTML <p> This is a sentence. </p> 这对英语很好,但对汉字不好,因为我们不使用空格来分隔汉语中的单词。下面是一个例子(中文句子与“thisa句”的意思相同): 我想要的是以下内容,没有额外的空间 这是一句话。 如果当前行的最后一个字符和下一行的第一个字符都是汉字,我不知道为什么浏览器不忽略换行符(我认为这更有意义)。或者他们提供了这种机制,但需要特殊处理 顺便说一句,在Vim中,当使用“

将换行符转换为空格对于英语是有意义的,例如,下面的HTML

<p>
This is
a sentence.
</p>
这对英语很好,但对汉字不好,因为我们不使用空格来分隔汉语中的单词。下面是一个例子(中文句子与“thisa句”的意思相同):

我想要的是以下内容,没有额外的空间

这是一句话。
如果当前行的最后一个字符和下一行的第一个字符都是汉字,我不知道为什么浏览器不忽略换行符(我认为这更有意义)。或者他们提供了这种机制,但需要特殊处理

顺便说一句,在Vim中,当使用“J”连接行时,如果两行的最后一个和第一个字符都是中文字符,则不会添加空格。但对于英语,将添加一个空格。所以我猜Vim对这个做了一些特殊的处理

更新:

虽然我认为这是浏览器的问题,但我不得不接受。因此,目前我会在生成HTML之前预处理我的标记文本以加入中文行。下面是我如何在Ruby中实现这一点的,完整的代码也可以处理中文标点符号

您可以对预格式化文本使用
标记,也可以更改其样式。预先格式化的文本将按字面形式接受换行符,并将其呈现为新行

<p class="nowhitespace">
  <span>这是</span>
  <span>一句话。</span>
</p>
如果您不想要

.nowhitespace { font-size: 0; }
.nowhitespace > span { font-size: 16px; }
换行符也被视为空白。当插入换行符时,它会考虑下面一行的前一行的一部分,并用一个空格替换该换行符。


您必须在HTML中显式声明换行符,只需使用

浏览器将换行符视为空格,因为自HTML2.0以来,规范都这么说。事实上,HTML2.0比后来的规范更温和;它说:“HTML用户代理应该在所有上下文中将其任何变体中的行尾视为一个单词空间,预格式化文本除外。”(),而较新的规范更强调这一点(将其描述为HTML中发生的情况)

背景是HTML和Web的开发主要考虑了西欧语言;这反映在原始规范和早期实现的许多特性中。它们只是慢慢地国际化了

解析规则不太可能更改。更可能发生的情况是对语言或角色属性渲染的敏感性。这意味着换行符仍然作为空格(DOM字符串将包含Ascii空格字符),但是这是 一句话。 将被渲染为空间不在那里。这就是HTML4.01规范所指的()。文本有点混乱,但我认为它试图说行为将取决于内容语言,或者由浏览器推断,或者在标记中声明

但浏览器还没有做到这一点。声明内容语言(例如,
)是一个很好的原则,但在呈现时几乎没有实际影响,它可能会影响浏览器对默认字体的选择(但有多少作者允许浏览器使用其默认字体?)。如果空格字符恰好在指定语言的浏览器默认字体中更宽,则它甚至可能导致增加间距


根据CSS3文本草案,您可以使用该属性。值
none
“关闭所有文本间距功能。所有全宽字符都设置了全宽标志符号。不幸的是,似乎还没有浏览器支持此功能。

有一种方法可以解决此问题(经典解决方法)。为了限制(当前)浏览器将换行符解释为空白,必须将字体大小设置为0

对于子元素,必须再次将字体大小设置为其初始值。因此,对于您的代码,示例如下:

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

到目前为止,我所知道的达到效果的最短方法是在打开标签后打断。但您不想在源代码中插入额外的标记。如果有一些标签不起任何作用就好了。事实上,有一条评论



灵感来源:

我的问题是,在处理汉字时,新行不应被视为空白。但是浏览器没有对汉字进行特殊处理。嗯,它没有。顺便说一句,没有HTML标签或CSS元素来解决这个问题,我怀疑当前浏览器中是否存在这样的功能(你可以编写一个脚本,从目录中的所有HTML文件中生成新的无行文件,每次你要将文件发布到web时都运行该脚本,并发布生成的文件。我知道这可以用脚本轻松解决。但我认为浏览器应该处理这个问题,以使大多数人的生活更轻松。正如你所看到的,Vim做到了这一点,在LaTeX中,我们可以禁止换行符转换为空格。谢谢,这确实有效。但这个技巧的一个问题是,我必须用
span
将包含中文文本的每一行包装起来。为了使事情更复杂,如果一行的开头/结尾是英文单词,那么我不应该关闭/打开
span
标记。是的,我知道-所以总的来说,你仍然需要包含一个函数来修改你上面写的那一行。我为设计目的提出了这个变通方法,空间扼杀了布局。
#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
<p class="nowhitespace">
  <span>这是</span>
  <span>一句话。</span>
</p>
.nowhitespace { font-size: 0; }
.nowhitespace > span { font-size: 16px; }
<p>
这是<!--
-->一句话。
</p>
这是一句话。