1

我想将字符串部分(即字符)与中文字符进行比较。我假设由于 Unicode 编码,它算作两个字符,所以我以 2 为增量循环遍历字符串。现在我遇到了一个障碍,我试图检测“儿”字符,但equals()不匹配,所以我错过了什么?这是代码片段:

for (int CharIndex = 0; CharIndex < tmpChar.length(); CharIndex=CharIndex+2) {

   // Account for 'r' like in dianr/huir
   if (tmpChar.substring(CharIndex,CharIndex+2).equals("兒")) {

另外,请随意提出一种更优雅的方式来解析这个......

[更新]来自调试器的一些图片,显示它不匹配,即使它应该匹配。我从用作输入的电子表格中粘贴了汉字,所以我认为这不是复制和粘贴问题(除非 unicode 在此过程中丢失)

在此处输入图像描述

在此处输入图像描述

哦,该死,显然它不能简单地复制和粘贴:

在此处输入图像描述

4

3 回答 3

0
if (tmpChar.substring(CharIndex,CharIndex+2).equals("兒")) {

是你的问题。儿只是一个 UTF-16 字符。许多汉字可以在一个编码单元中以 UTF-16 表示;Java 使用 UTF-16。但是,其他字符是两个代码单元。

类上有多种 APIString用于应对。

正如另一个答案中所提供的,获取IntStreamfromcodepoints允许您为每个字符获取 32 位代码点。您可以将其与您要查找的字符的代码点值进行比较。

或者,您可以使用具有更丰富功能的 ICU4J 库来完成所有这些工作。

于 2017-07-17T03:49:28.753 回答
0

Use CharSequence.codePoints(),它返回代码点流,而不必处理字符:

tmpChar.codePoints().forEach(c -> {
  if (c == '兒') {
    // ...
  }
});

(当然,您可以使用tmpChar.codePoints().filter(c -> c == '兒').forEach(c -> { /* ... */ }))。

于 2017-07-16T00:18:19.890 回答
0
于 2017-07-16T00:33:04.267 回答