【问题标题】:Unicode characters messed up after linebreak换行后 Unicode 字符混乱
【发布时间】:2013-12-24 07:08:42
【问题描述】:

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

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

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

谁能分享一下这里发生了什么?

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

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

【问题讨论】:

  • 这很有趣,但在 StackOverflow 上离题了。
  • 有趣的是,如果我将字符串 ↑↓↙↘ 粘贴到第二行的末尾(我将其视为两个带有问号的小框),那么前两个字符将被恢复并行阅读:↙↘↑↓↙↘。
  • 取决于字体。与例如Courier New, 盒子可见。使用 Consolas,带有问号的框。使用 Calibri,箭头显示在 OK 上。所以这似乎只是一个渲染错误。
  • @Jukka:我已经编辑了这个问题,以澄清为什么我认为实际上是主题。您能否更具体地说明为什么您认为它不是?
  • 这是关于某些程序中的一些故障,而不是关于您正在编写或修改的某些代码的编程问题。如果 Notepad++ 的作者向它提供了有关其源代码等的足够信息,那将是一个话题。

标签: unicode utf-8 character-encoding


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢!对我来说,这意味着我应该坚持那些实际出现在大多数典型字体中的字符。我不知道你指出的后备逻辑,所以我假设这些箭头字符是我字体的一部分(我可以清楚地看到它们):-)
猜你喜欢
  • 2011-04-22
  • 2015-05-06
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
相关资源
最近更新 更多