我想分析char数组中的全宽或半宽字符。
例如:
char [] password = {'t','e','s','t','思','题'};
此char数组中有全宽和半宽字符。
半宽= t,e,s,t
全宽=思,题
那么,我如何分析java中char数组的全宽或半宽?
非常感谢!
答案 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:不明确的字符在东亚传统字符集中出现为宽字符,但在非东亚用法中出现为窄(即正常宽度)字符。
AMBIGUOUS
对NEUTRAL
来说也是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的全宽字符块范围内。但是该块不包括一些中文常用文本,例如`。