代码之家  ›  专栏  ›  技术社区  ›  Ira Baxter

html<pre>标记似乎不接受unicode字符“行分隔符”(u+2028)作为换行符

  •  3
  • Ira Baxter  · 技术社区  · 8 年前

    称我史前的,但我试图使用xhtml文档类型编码在一个utf8 html页面与包含一些unicode换行符u2028文本的预标记。

    firefox似乎至少不把u2028作为pre块中的换行符。将字符更改为u000d或u000a似乎会产生我所期望的换行符。(从技术上讲,u2028在utf8中被编码为一个3字节的序列,但我假设它在读取时被规范化了)。我还没有用其他浏览器测试过。

    我试着在html上深入研究w3c文档,但无法从pre一节中找出哪些字符被视为换行符。在pre中被解释为换行符的章节在哪里?当在unicode文件中发现u2028时,是因为firefox有缺陷,还是html标准的大脑无法将u2028解释为换行符?

    我觉得很奇怪,一个包含Unicode的文本(例如源代码)文件不会使用U2028作为换行符的标准(我实际上有一个代码生成器生成这样的源代码,我正试图在HTML页面中显示该代码)。因此,将这样的代码直接放在预块中,我认为会产生我所期望的行为。

    1 回复  |  直到 8 年前
        1
  •  3
  •   BoltClock    8 年前

    不管pre元素的性质如何,它的呈现行为实际上是在css中指定的,而不是在html中指定的,因为它与空白呈现有关。

    CSS2 表示u+000d和u+000a计为换行符,用户代理可以识别并规范其他unicode字符。但它没有提到U+2028。

    css-text-3更全面地涵盖了空白和换行处理。它定义了这个术语 segment break 如下:

    对于css处理,文本中的每个文档语言定义的段中断、crlf序列(u+000d u+000a)、回车(u+000d)和换行(u+000a)都被视为 分段中断 ,然后根据 white-space 财产。

    和CSS2一样,它没有提到U+2028。

    但是, in a later section ,它确实提到了强制中断字符(其中u+2028是其中之一):

    确定换行符时:

    • 不管 白色空间 值,行总是在每个保留的强制中断字符处断开:对于所有值,必须遵守为[uax14]中的bk、cr、lf、cm、nl和sg换行类定义的换行行为。

    注意它甚至说“不管 白色空间 值“这意味着即使在一个前置元素之外, U+2028 must introduce a line break (以类似于br元素的方式)!

    至于实现,Internet Explorer和Microsoft Edge似乎是唯一将U+2028作为前置元素中的换行符呈现的浏览器,默认值为 white-space: pre . 唯一需要注意的是,它们将其规范化为u+000a,因此它最终被视为pre元素之外的常规空白(或者 空白:pre / pre-line )这符合css-text-3所说的 保存 强制中断,但我不确定将u+2028规范化为u+000a本身是否可以接受,或者是否违反了unicode/css规范。

    windows 10上的chrome总是打印一个标记为lsep的符号,而firefox总是打印一个零宽度的字符。

    在这些情况下,文档是application/xhtml+xml还是text/html似乎都没有区别。

    推荐文章