东亚字符的宽度描述于Unicode 标准附件 #11其中谈到East_Asian_Width
Unicode 字符的属性。
虽然我找不到使用标准 Java 8 库查询此属性的方法,但可以使用ICU4J库 (com.ibm.icu.icu4j在 Maven 中)来获取这个值。
例如,以下代码返回UCharacter.EastAsianWidth.WIDE
:
int esw = UCharacter.getIntPropertyValue('あ', UProperty.EAST_ASIAN_WIDTH);
对日语字符的一些测试表明,所有单字节 Shift JISkana字符(例如半角カ
)被指定HALFWIDTH
,而它们的全角对应项(例如カ
)被指定FULLWIDTH
。所有其他全角字符,例如あいうえお
return WIDE
和非全角字符,例如普通字符Abc
return NARROW
.
价值AMBIGUOUS
需要额外小心,因为它的宽度会根据上下文而变化。例如,vim编辑器有一个ambiwidth option让用户选择是否应将其视为窄的或宽的,因为渲染取决于终端。
上述附件不明确字符的状态: 不明确的字符在东亚传统字符集中作为宽字符出现,但在非东亚使用中作为窄(即正常宽度)字符出现。
It also states for NEUTRAL
: 严格来说,对于中性字符谈论窄字符和宽字符是没有意义的,但由于出于所有实际目的,它们的行为类似于 Na,因此根据以下建议将它们视为窄字符(与 Na 相同)。
然而,我发现了Narrow for NEUTRAL
情况并非总是如此,因为某些字符在我尝试过的编辑器中可能会显示得很宽。此外,ⅶ
, ⅷ
, ⅸ
, ⅹ
are AMBIGUOUS
,而前面的字符ⅺ
and ⅻ
are NEUTRAL
这似乎没有道理。也许字符未映射到icu4j
回落到NEUTRAL
.
Lastly, UCharacter.EastAsianWidth.COUNT只是一个常量,表示下定义的属性数量UCharacter.EastAsianWidth
,而不是一个值getIntPropertyValue()
将返回。