【问题标题】:UTF-16LE Halfwidth vs Fullwidth? The meaning?UTF-16LE 半角和全角?意义?
【发布时间】:2018-03-29 23:34:23
【问题描述】:

我有用于打印数字的自定义打印功能。我制作了一个 ASCII 版本和一个 UTF-16LE 版本。 UTF-16LE 版本对 0-9 使用全角代码/字符,对十六进制使用 A-F。在调试我的函数时,我注意到 Visual Studio 中的字符看起来与 ASCII 字符有点不同,虽然这并没有打扰我,但它让我开始思考。所以我决定在谷歌上快速搜索“Unicode 半角与全角”

...我发现有几页谈论“全宽”形式指的是字符的 Visual 宽度,而我认为“全宽”指的是编码的宽度(2字节或更多)...

以下是其中的几页和引述:

当我们有不同的 Fonts 用于大小和对齐时,"Fullwidth" 指代视觉宽度对我来说没有意义。

所以:

A - 谁能给我一个很好的答案,为什么“全宽”指的是视觉宽度。 Unicode UTF-16 规范中的什么地方是这样说的?

B - 作为开发人员/程序员,是否可以选择使用标志输出为半角或全角?

【问题讨论】:

标签: c++ unicode printf utf-16le full-width


【解决方案1】:

您发现的半角假名只是Halfwidth and fullwidth forms 的一个子集,它是代码点/字形的属性,而不是编码的属性。 UTF-16 是 Unicode 的编码之一。

这些字符存在的原因是因为Unicode was designed for lossless back-and-forth conversion between legacy character sets。如果您仔细查看Unicode blocks,您会发现有很多冗余字符,例如Ⅶ Ⅷ Ⅸ ㎆ ㎇ ㎎ ㎏ ㎐ Dz dz NJ...。它们都纯粹出于兼容性目的,因为它们已在某些字符集中使用。

另见What issues lead people to use Japanese-specific encodings rather than Unicode?

作为开发人员/程序员,是否可以选择使用标志输出为半角或全角?

我个人认为没有理由使用它们,除非在极少数情况下,例如 displaying characters on a square grid。更糟糕的是,这些日文字符通常在没有清晰字体和抗锯齿(小尺寸)的情况下呈现,因此阅读起来很痛苦。如果您在日本,您会注意到一些表单需要使用半角或全角字符而不自动转换,这很糟糕。

【讨论】:

  • 我认为 Dz 和其他一些二合字母有一个当前有价值的存在理由:它们是某些语言的官方字母表的某些脚本中的字母。当然,它们可以被分解,但字母表中的字母与单个字符的概念很好地对应。这也有助于排序规则,它们的排序方式与分解的表单不同。
  • @TomBlodget 但是有这么多的二合字母,如果我们有单独的字符,那么其他语言会问为什么他们没有代码点,并且需要不断地添加新的未来。这也会使整理规则更加复杂。西班牙语已经放弃使用 ch 作为字母表中的单独字符,因此有很多语言
【解决方案2】:

您找到了关于全角与半角起源的自己的答案,所以我不会深入探讨。是的,名称是指字符的视觉宽度。抱歉,我没有任何官方参考。

Unicode 的目标之一是处理从/到任何旧字符集的往返转换而不会丢失。由于存在带有全角字符的旧字符集,因此它们也必须是 Unicode 的一部分,否则它们会被错误地转换。

我发现很难想象现代代码中会出现在普通字符和全角字符之间进行选择的情况。它实际上仅用于旧版支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2019-01-01
    • 2014-08-14
    • 2020-01-12
    • 2016-06-08
    • 1970-01-01
    相关资源
    最近更新 更多