换行后 Unicode 字符变得困惑

标签 unicode utf-8 character-encoding

某些 Unicode 字符组合似乎存在问题。我将使用 Notepad++ 向您展示我的意思。

  1. 在 Notepad++ 中创建一个新的文本文件,并将编码更改为 UTF-8(BOM 无关紧要)。
  2. 复制并粘贴以下四个箭头:↑↓↙↘。这看起来应该不错(见下面第一张图片)。
  3. 现在在第二个箭头后面插入换行符(Windows/Unix 无关紧要)。现在第一行看起来仍然很好,但是第二行中的箭头被占位符框替换(参见下面的第二张图片)。
  4. 保存和重新打开没有什么区别。仍然是第二行的盒子。删除换行符,一切看起来都恢复正常了。

此问题并非 Notepad++ 独有。其他程序在加载带有换行符的文本文件时也会显示垃圾。令人惊讶的是,标准 Windows 记事本可以正常显示它。

这是工作文件,一次是十六进制,一次是在 Notepad++ 中:

E2 86 91   E2 86 93   E2 86 99   E2 86 98

Works

这是损坏的文件。请注意,所有不同之处在于添加的换行符 (0D 0A)。

E2 86 91   E2 86 93   0D 0A   E2 86 99   E2 86 98

Doesn't work

有人可以分享一下这里发生的事情吗?

编辑:我正在编写一个以文本格式创建输出的程序。当几个文本编辑器无法正确显示我的程序的输出时,我偶然发现了这个问题,所以我首先假设我的程序有问题。就目前而言,它的输出很好。所以真正的问题是:

有没有办法更改第二个(损坏的)示例,以便它能够在您的典型编辑器中正确显示?

最佳答案

这是一个字体问题,在文本编辑器中表现出一些错误或缺陷。人们实际上可能会问为什么,例如Notepad++ 在使用 Courier New(我认为这是它的默认字体)时完全显示“↙↘”。该字体(以及许多其他字体)根本不包含这些字符。

查看问题中的示例,您可能会发现在“↑↓↙↘”中,前两个字符与其他两个字符的风格不同。原因是它们以两种不同的字体显示。 (我在 Arial 和 DejaVu Sans 中看到它们。您的情况可能会有所不同,具体取决于系统中安装的字体和浏览器的后备字体列表。)

类似的事情也会发生,例如在 Notepad++ 和记事本中。当使用的主要字体不包含文本中的所有字符时,程序将使用一些后备字体。这可能是在程序代码中硬连线的,也可能是用户可设置的。

由于某种原因,在 Notepad++ 中,字体回退机制在某些情况下会失败。如果您只删除前两个字符,或者最初只输入“↙↘”,也会发生这种情况。显然,同一行中这些字符之前的内容会影响字体选择机制。您可能会考虑提交错误报告,但它可能被归类为功能,而不是错误。毕竟,要求程序渲染未出现在程序设置使用的字体中的字符可能会导致一般失败,而不仅仅是某些情况下的失败。

解决方案是,当使用文本编辑器查看数据时,应将编辑器设置为使用包含文本中出现的所有字符的字体。请参阅a list of fonts supporting “↙” (并不详尽,但可能很好地涵盖了普通计算机可以安装的字体)。在文本编辑器中,您可能希望使用等宽字体;在这种情况下,DejaVu Sans Mono 可能就足够了(除非有其他相对不常见的特殊字符 - 该字体只有 3,310 个字形)。

关于换行后 Unicode 字符变得困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20749958/

相关文章:

C# UTF8 读取/输出

windows - 什么是 Windows 代码页?

perl - 如何在 perl 中将重音字符和其他外来字符编码为 UTF8

python - 在 Python 2.7 中使用 unicodedata.normalize

python - 将数字字符串转换为上标

c++ - 如何解码多字节 utf8 字符串? (C++)

Java byte[] 到/从 String 转换

c++ - 将字符串转换为UTF8字符串所需

c# - 从使用C#中的错误代码页中恢复

c++ - 无法将非英文文本打印到控制台窗口