Java中如何检测中文字符

20

如何使用Java检测字符串中是否包含中文字符?

    String chineseStr = "已下架" ;

if (isChineseString(chineseStr)) {
  System.out.println("The string contains Chinese characters");
}else{
  System.out.println("The string contains Chinese characters");
}

你能帮我解决这个问题吗?


1
你想要区分中国大陆和/或台湾使用的汉字,还是任何CJK表意文字都可以?例如,“辻”由汉字元素组成,但是它是在日本创造并仅在那里使用的。 - Seva Alekseyev
@Seva Alekseyev,我刚刚看到这个问题:对于我的情况来说,任何中文/日文/非韩文字符都可以;我的意思是,即使是那些在中国不常用的字符,比如“峠”。 - SebasSBM
我认为这就是Joop的答案所做的。我有一个类似的逻辑,我将代码点与Unicode中的CJK范围进行比较。Unicode的映射可以在维基百科等地方找到。 - Seva Alekseyev
3个回答

49

现在,Character.isIdeographic(int codepoint) 可以判断一个代码点是否是CJKV(中文、日文、韩文和越南文)表意文字。

更近的方法是使用 Character.UnicodeScript.HAN。

因此:

System.out.println(containsHanScript("xxx已下架xxx"));

public static boolean containsHanScript(String s) {
    for (int i = 0; i < s.length(); ) {
        int codepoint = s.codePointAt(i);
        i += Character.charCount(codepoint);
        if (Character.UnicodeScript.of(codepoint) == Character.UnicodeScript.HAN) {
            return true;
        }
    }
    return false;
}

或者在Java 8中:

public static boolean containsHanScript(String s) {
    return s.codePoints().anyMatch(
            codepoint ->
            Character.UnicodeScript.of(codepoint) == Character.UnicodeScript.HAN);
}

1
isIdeographic()和UnicodeScript仅适用于JDK 1.7。但在像Consolas这样的字体中,表意字符通常是两个空格宽度,因此通过仅计算字符(无论是否为代理)来显示错误符号是有效的。 - user502187
@j4nbur53,感谢您提到Character.isIdeographic(cp),这是自Java 1.7以来的一部分。 - Joop Eggen

4
更直接的方法:
if ("粽子".matches("[\\u4E00-\\u9FA5]+")) {
    System.out.println("is Chinese");
}

如果你需要捕获罕见和异国情调的字符,则需要添加所有范围:Unicode中汉字的完整范围是什么?

3
这个不仅仅是检测中文字符,还能判断整个字符串是否为中文。在开头和结尾添加 ".*" 以便检测任何单个的中文字符。 - JanBrus

0

你可以尝试使用谷歌API语言检测API

语言检测API包含简单的演示。你可以先试试。


4
该工具检测的是语言,而不是字符。 - Karol S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接