如何判断字符串中含有日文字符

最近做的东西有这么一个需要:判断一个字符串中是否含有日文字符。最直观的想法就是使用正则表达式,因此上网一搜,找到了这个 utf-8 对应的日文字符列表:http://ash.jp/code/unitbl21.htm 。满心欢喜,按照列表,用utf-16指定的区间,再用正则表达式方式写了一个判断方法。

测试了几个单词,正确。不过测试了几个汉字,发现不对。

仔细看了看那个表,发现 字母和假名部分,utf-16是连续的,但是汉字和特殊字符部分,就不是连续的了。这就是用正则表达式也得累死人!

再看看那个表,SJIS 编码的code是连续的,恩,可以使用区间,所以字符串得转换一下:

str = new String(str.getBytes(), "UTF-8");
byte[] bt = str.getBytes("SHIFT-JIS");


不过那个表也真大阿!!就算用 shift-jis编码,正则表达式也不短!

在输出 byte[] 的时候,发现如果是中文的话,那么 byte[] 的长度会小于4,而且不会被2 整除。于是乎,方法来了:

return bt.length %2 == 0;


这个方法可以判断一个字符是否为日文字符,那么判断字符串中是否包含日文字符也不难了。

以下是测试类:


assertTrue(CharacterUtil.isContainJapaneseCharacter("亜亜"));

assertTrue(CharacterUtil.isContainJapaneseCharacter("お早う"));
assertTrue(CharacterUtil.isContainJapaneseCharacter("学校"));
assertTrue(CharacterUtil.isContainJapaneseCharacter("お早う,tom!"));
assertFalse(CharacterUtil.isContainJapaneseCharacter("严"));
assertFalse(CharacterUtil.isContainJapaneseCharacter("tom"));

try {
InputStream is = getClass().getClassLoader().getResourceAsStream("util/CharacterTest.utf_8");
LineNumberReader ln = new LineNumberReader(new InputStreamReader(is, "UTF-8"));
// 汉字 足
assertTrue(CharacterUtil.isContainJapaneseCharacter(ln.readLine()));
// あし 足
assertTrue(CharacterUtil.isContainJapaneseCharacter(ln.readLine()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


其中比较特殊的是 “足”之类的文字,在 UNICODE 列表中,中日韩有几部分是公用一些汉字的。(CharacterTest.utf_8 是一个 utf-8 编码的文本文件,里面分别用汉字和日文写了“足”这个字 )。

你可能感兴趣的:(工作)