HTML <pre> 标签似乎不支持 Unicode 字符 'LINE SEPARATOR' (U+2028) 作为换行符

HTML <pre> tag does not seem to honor Unicode Character 'LINE SEPARATOR' (U+2028) as line break

叫我史前,但我正在尝试使用在 UTF8 html 页面中编码的 XHTML 文档类型,其中包含带有一些 unicode 换行符 u2028 的文本的 PRE 标记。

Firefox 至少似乎不承认 u2028 作为 PRE 块中的换行符。将字符更改为 u000D 或 u000a 似乎会产生我所期望的换行符。 (从技术上讲,u2028 在 UTF8 中编码为 3 字节序列,但我假设它在读取时被归一化)。我还没有在其他浏览器上测试过。

我尝试在 HTML 上深入研究 W3C 文档,但无法从 PRE 上的部分弄清楚哪些字符被视为换行符。关于在 PRE 中被解释为换行符的章节和诗句在哪里? u2028 是这样处理的,Firefox 有缺陷,还是 HTML 标准脑死了,在 Unicode 文件中发现时不将 u2028 解释为换行符?

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

尽管 PRE 元素的性质可能表明,它的渲染行为实际上是在 CSS 中指定的,而不是在 HTML 中指定的,因为它与空白渲染有关。

CSS2 表示 U+000D 和 U+000A 算作换行符,用户代理可以识别和规范化其他 Unicode 字符。但是它没有在任何地方提到 U+2028。

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

For CSS processing, each document language–defined segment break, CRLF sequence (U+000D U+000A), carriage return (U+000D), and line feed (U+000A) in the text is treated as a segment break, which is then interpreted for rendering as specified by the white-space property.

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

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

When determining line breaks:

  • Regardless of the white-space value, lines always break at each preserved forced break character: for all values, line-breaking behavior defined for the BK, CR, LF, CM, NL, and SG line breaking classes in [UAX14] must be honored.

请注意,它甚至说“不考虑 white-space 值”;这意味着即使在 PRE 元素之外,U+2028 must introduce a line break(以类似于 BR 元素的方式)!

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

Chrome on Windows 10 始终打印标记为 LSEP 的符号,而 Firefox 始终打印零宽度字符。

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