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

时间:2012-11-22 02:27:36

标签: java

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

例如:

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

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

半宽= t,e,s,t

全宽=思,题

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

非常感谢!

5 个答案:

答案 0 :(得分:3)

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' ;
}

答案 1 :(得分:1)

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

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

我可能会在这里完全咆哮错误的树,所以请告诉我这是否是你所追求的。

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

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

东亚字符的宽度在Annex #11 of the Unicode Standard中描述,其中讨论了Unicode字符的East_Asian_Width属性。

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

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

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

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

NARROW需要额外注意,因为它的宽度会因上下文而异。例如, vim 编辑器有一个ambiwidth option,让用户选择是应该将其处理为窄还是宽,因为渲染是终端相关的。

前面提到的附件states for ambiguous characters不明确的字符在东亚传统字符集中出现为宽字符,但在非东亚用法中出现为窄(即正常宽度)字符。

AMBIGUOUSNEUTRAL来说也是states:严格来说,对于中性字符来说,狭义和宽泛是没有意义的,但是因为出于所有实际目的,它们的行为就像Na,它们是根据以下建议处理为窄字符(与Na相同)。

但是,我发现NEUTRAL Narrow 并非总是如此,因为在我尝试的编辑器中,某些字符可能显得很宽。此外,AMBIGUOUS,而后续字符为{{ 1}}这似乎没有意义。也许未在NEUTRAL中映射的字符可以回退到icu4j

最后,UCharacter.EastAsianWidth.COUNT只是一个常量,表示NEUTRAL下定义的属性数,而不会返回值UCharacter.EastAsianWidth

答案 4 :(得分:0)

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