3

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

例如:

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

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

半宽 = t,e,s,t

全宽 = 思,题</p>

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

非常感谢!

4

5 回答 5

4

JDK 包含一个提到全角/半角的类:InputSubset

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

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

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

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

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

我想你的用例说 0x00-0xFF 字符是半角就足够了;其他字符是全角的,除了 unicode 块“半角和全角形式”中的半角字符

boolean isHalfWidth(char c)
{
    return '\u0000' <= c && c <= '\u00FF'
        || '\uFF61' <= c && c <= '\uFFDC'
        || '\uFFE8' <= c && c <= '\uFFEE' ;
}
于 2012-11-22T03:31:16.197 回答
3
于 2016-02-27T04:32:21.933 回答
1

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

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

不过,我可能在这里完全找错了树,所以如果这就是你所追求的,请告诉我。

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

于 2012-11-22T02:41:42.463 回答
0

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

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

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

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

于 2012-11-22T02:59:05.723 回答
0

这实际上取决于您如何定义全角字符。Java String 的内部表示是 UTF-16,所以每个字符的范围是 1 到 2^16。如果使用unicode的定义定义全角字符,则只需检查 char 是否在 unicode 全角字符块的范围内。但该块不包括一些常见的中文文本,例如‵。</p>

于 2017-06-14T03:58:24.660 回答