我想分析字符数组中的全角或半角字符。
例如:
char [] password = {'t','e','s','t',‘思’,‘題’};
此字符数组中有全角和半角字符。
半宽= t,e,s,t
全宽=思,題
那么,如何在java中分析char数组的全宽或半宽呢?
非常感谢!
发布于 2012-11-22 11:31:16
JDK包含一个提到全宽/半宽的类:InputSubset
http://docs.oracle.com/javase/7/docs/api/java/awt/im/InputSubset.html
不幸的是,没有方法来检查哪个字符属于哪个子集。
尽管如此,显然全宽/半宽对于独角兽来说是一个定义良好的概念。也许在互联网上的某个地方有一个准确的规格。
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' ;
}发布于 2016-02-27 12:32:22
东亚字符的宽度是在Annex #11 of the Unicode Standard中描述的,它讨论了Unicode字符的East_Asian_Width属性。
尽管我找不到使用标准Java8库来查询这个属性的方法,但是可以使用ICU4J library (Maven语言中的com.ibm.icu.icu4j)来获得这个值。
例如,以下代码返回UCharacter.EastAsianWidth.WIDE
int esw = UCharacter.getIntPropertyValue('あ', UProperty.EAST_ASIAN_WIDTH);对日文字符的一些测试表明,所有单字节移位JIS假名字符(例如半角カ)都被指定为HALFWIDTH,而它们的全角对应字符(例如カ)则被指定为FULLWIDTH。所有其他全角字符(如あいうえお )返回WIDE,非全角字符(如普通Abc )返回NARROW。
值AMBIGUOUS需要特别注意,因为它的宽度将根据上下文的不同而变化。例如,vim编辑器有一个ambiwidth option,让用户选择是窄还是宽,因为渲染依赖于终端。
前面提到的附件states for ambiguous characters:歧义字符在东亚传统字符集中作为宽字符出现,但在非东亚使用中作为窄(即,正常宽度)字符出现。
这也是NEUTRAL的states:严格地说,谈论中性字符的窄和宽是没有意义的,但因为在所有实际目的中,它们的行为都像Na一样,所以在下面的建议下,它们被视为窄字符(与Na相同)。
然而,我发现NEUTRAL的宽度并不总是如此,因为在我尝试过的编辑器中,有些字符可能显示得很宽。此外,ⅶ、ⅷ、ⅸ、ⅹ是AMBIGUOUS,而前面的字符ⅺ和ⅻ是NEUTRAL,这似乎没有什么意义。也许没有在icu4j中映射的字符会回退到NEUTRAL。
最后,UCharacter.EastAsianWidth.COUNT只是一个表示在UCharacter.EastAsianWidth下定义的属性数量的常量,而不是getIntPropertyValue()将返回的值。
发布于 2012-11-22 10:41:42
字符的可见宽度实际上取决于查看它的字体,而Java中的字符相对于字体是抽象的。
如果您希望确定某个特定字符是否为CJK (或语言子集等)。字符,您可以尝试查找这些字符在UTF-16中采用的位模式范围(我想这就是java使用的?)并确保每个char值都在该范围内。
不过,我可能完全找错了地方,所以如果这就是你要找的,请告诉我。
编辑:实际上,在看了垃圾神的链接后,我现在不确定java编码是完全抽象的。不过,字符比较可能仍然是一个很好的方法,因为在字符文档中有全角十六进制代码的定义。
https://stackoverflow.com/questions/13505075
复制相似问题