首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分析Java中的全角或半角字符

分析Java中的全角或半角字符
EN

Stack Overflow用户
提问于 2012-11-22 10:27:36
回答 5查看 6.6K关注 0票数 3

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

例如:

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

此字符数组中有全角和半角字符。

半宽= t,e,s,t

全宽=思,題

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

非常感谢!

EN

回答 5

Stack Overflow用户

发布于 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“中的半角字符之外,其他字符都是全角的。

代码语言:javascript
复制
boolean isHalfWidth(char c)
{
    return '\u0000' <= c && c <= '\u00FF'
        || '\uFF61' <= c && c <= '\uFFDC'
        || '\uFFE8' <= c && c <= '\uFFEE' ;
}
票数 4
EN

Stack Overflow用户

发布于 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

代码语言:javascript
复制
int esw = UCharacter.getIntPropertyValue('あ', UProperty.EAST_ASIAN_WIDTH);

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

AMBIGUOUS需要特别注意,因为它的宽度将根据上下文的不同而变化。例如,vim编辑器有一个ambiwidth option,让用户选择是窄还是宽,因为渲染依赖于终端。

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

这也是NEUTRALstates:严格地说,谈论中性字符的窄和宽是没有意义的,但因为在所有实际目的中,它们的行为都像Na一样,所以在下面的建议下,它们被视为窄字符(与Na相同)。

然而,我发现NEUTRAL的宽度并不总是如此,因为在我尝试过的编辑器中,有些字符可能显示得很宽。此外,AMBIGUOUS,而前面的字符NEUTRAL,这似乎没有什么意义。也许没有在icu4j中映射的字符会回退到NEUTRAL

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

票数 3
EN

Stack Overflow用户

发布于 2012-11-22 10:41:42

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

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

不过,我可能完全找错了地方,所以如果这就是你要找的,请告诉我。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13505075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档