分析Java中的全宽或半宽字符

我想分析char数组中的全宽或半宽字符。

例如:

char [] password = {‘t’,’e’,’s’,’t’,’思’,’题’};

此char数组中有全宽和半宽字符。

半宽= t,e,s,t

全宽=思,题

那么,我如何分析java中char数组的全宽或半宽?

非常感谢!

JDK包含一个提及完整/半宽的类: InputSubset

http://docs.oracle.com/javase/7/docs/api/java/awt/im/InputSubset.html

不幸的是,没有办法检查哪个char属于哪个子集。

尽管如此,显然全/半宽是一个明确定义的unicodes概念。 互联网上某处可能有准确的规范。

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

http://en.wikipedia.org/wiki/DBCS

我猜你的用例就足够了,0x00-0xFF字符是半宽的; 其他字符是全宽的,除了unicode块“Halfwidth and Fullwidth Forms”中的半宽字符

 boolean isHalfWidth(char c) { return '\u0000' <= c && c <= '\u00FF' || '\uFF61' <= c && c <= '\uFFDC' || '\uFFE8' <= c && c <= '\uFFEE' ; } 

字符的可见宽度实际上取决于您查看它的字体,而Java中的字符相对于字体是抽象的。

如果你想确定一个特定的字符是CJK(或语言子集等)字符,你可能会尝试找到这些字符在UTF-16中使用的位模式范围(我认为这是java使用的?)和确保每个char值都在该范围内。

我可能会在这里完全咆哮错误的树,所以让我知道这是你所追求的。

编辑 :实际上,在查看trashgod的链接后,现在我不确定java编码是完全抽象的。 但是,字符比较可能仍然是一个很好的方法,因为字符文档中有全宽hex代码的定义。

您似乎在谈论字符内部表示中的位数,而不是另一个答案中提到的“可见宽度”。

Java中的Character类和char原语类型都使用标准Unicode; 它处理拉丁语,中文和许多其他语言。 一些unicode字符是16位; 有些人更多。

所以我认为你的问题的答案是:继续分析你想要的 – 你的数组包含一些16位值,可能还有一些大于16位的值。 如果不了解你想要对角色做什么,就很难更明确。

编辑:我的错误,char原语只处理16位unicode值。 但是一个Character对象数组将处理大于16位的unicode值。

Unicode标准的附件#11中描述了东亚字符的宽度,该附件讨论了Unicode字符的East_Asian_Width属性。

虽然,我找不到使用标准Java 8库查询此属性的方法,但可以使用ICU4J库 (Maven中的com.ibm.icu.icu4j )来获取此值。

例如,以下代码返回UCharacter.EastAsianWidth.WIDE

 int esw = UCharacter.getIntPropertyValue('あ', UProperty.EAST_ASIAN_WIDTH); 

一些使用日文字符的测试表明,所有单字节Shift JIS 假名字符(例如HALFWIDTH )都被指定为HALFWIDTH ,而它们的全宽对应字符(例如 )被指定为FULLWIDTH 。 所有其他全宽字符,如あいうえお返回WIDE ,非全宽字符,如普通Abc返回NARROW

AMBIGUOUS需要一些额外的关注,因为它的宽度将根据上下文而变化。 例如, vim编辑器有一个ambiwidth选项 ,让用户选择是应该将其处理为窄还是宽,因为渲染是终端相关的。

上述附件陈述了模糊字符 : 模糊字符在东亚传统字符集中出现为宽字符,但在非东亚用法中出现为窄(即正常宽度)字符。

它还说明 NEUTRAL严格地说,对于中性字符来说,狭义和广义的讨论是没有意义的,但是因为出于所有实际目的,它们的行为类似于Na,根据下面的建议,它们被视为窄字符(与Na相同) 。

但是,我发现Naru for NEUTRAL并非总是如此,因为有些角色在我尝试过的编辑器中可能会显得很宽泛。 此外, AMBIGUOUS ,而前进的字符NEUTRAL ,这似乎没有意义。 也许未在icu4j映射的字符会回退到NEUTRAL

最后, UCharacter.EastAsianWidth.COUNT只是一个常量,表示在UCharacter.EastAsianWidth下定义的属性数,而不是值getIntPropertyValue()将返回。

这实际上取决于您如何定义全宽字符。 Java String的内部表示forms为UTF-16,因此每个字符的范围为1到2 ^ 16。 如果使用unicode的定义定义全角字符,则只需检查char是否在unicode的全宽字符块范围内。 但是这个块不包括一些中文常用文本,如`。