换行后Unicode字符搞砸了

时间:2013-12-23 19:30:11

标签: unicode utf-8 character-encoding

某些Unicode字符组合似乎有问题。我会告诉你我用Notepad ++的意思。

  1. 在Notepad ++中创建一个新的文本文件,并将编码更改为UTF-8(BOM无关紧要)。
  2. 复制并粘贴以下四个箭头:↑↓↙↘。这应该看起来很好(见下面的第一张图片)。
  3. 现在在第二个箭头后插入换行符(Windows / Unix无关紧要)。现在第一行看起来仍然很好,但第二行中的箭头被占位符框替换(见下面的第二张图片)。
  4. 保存和重新开放没有任何区别。还是第二行的盒子。删除换行符,一切看起来都很好。
  5. 这个问题不是Notepad ++独有的。使用换行符加载文本文件时,其他程序也会显示垃圾。令人惊讶的是,标准的Windows Notepad显示它很好。

    这是工作文件,一次是十六进制,一次是在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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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