UTF-16LE半宽与全宽?意思?

时间:2018-03-29 23:34:24

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

我有用于打印数字的自定义打印功能。我制作了ASCII版本和UTF-16LE版本。 UTF-16LE版本使用0-9的全宽度代码/字符和十六进制的A-F。在调试我的功能时,我注意到视觉工作室中的角色与ASCII角色看起来有点不同,虽然这并没有让我烦恼,但它让我思考它。所以我决定快速进行谷歌搜索" unicode halfwidth vs fullwidth"

...我发现了几个关于" Fullwidth"形式指的是角色的视觉宽度,而我认为" Fullwidth"参考编码的宽度(2字节或更多)......

以下是一些页面和引用:

https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms

ICU Unicode Normal vs Fullwidth "为了使事情整齐排列,IBM定义了一套全宽的' (更好的是'双倍宽度')字母和数字。"

https://en.wikipedia.org/wiki/Half-width_kana "半角假名是以正常宽度的一半(1:2纵横比)显示的片假名字符,而不是通常的正方形(1:1)纵横比。例如,片假名ka的通常(全宽)形式是カ,而半宽形式是カ。"

对我来说,#34; Fullwidth"当我们有不同的字体大小和对齐时,它会引用视觉宽度。

所以:

A - 任何人都可以给我一个很好的答案,为什么" Fullwidth"会指视觉宽度。它在Unicode UTF-16规范中的位置是这么说的吗?

B - 作为开发人员/程序员,可以选择使用标记输出Halfwidth或Fullwidth吗?

2 个答案:

答案 0 :(得分:3)

你发现的半宽假名只是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?

  

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

我个人认为没有理由使用它们,除非在极少数情况下,例如displaying characters on a square grid。更糟糕的是,那些日文字符通常是在没有清晰类型和抗锯齿(小尺寸)的情况下渲染的,因此阅读时会感到痛苦。如果你在日本,你会注意到一些需要使用半宽或全宽字符但没有自动转换的表格,这很糟糕。

答案 1 :(得分:1)

你找到了自己对全宽与半宽的起源的答案,所以我不会进入。是的,名称是指角色的视觉宽度。对不起,但我没有任何官方参考。

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

我发现很难想象在现代代码中您需要在普通字符和全字符字符之间进行选择的情况。它实际上只适用于传统支持。