Как сравнить китайские иероглифы в Java с помощью функции "equals()"

Я хочу сравнить строковую часть (т.е. символ) с китайским символом. Я предполагаю, что из-за кодировки Unicode он считается как два символа, поэтому я перебираю строку с шагом в два. Теперь я наткнулся на контрольно-пропускной пункт, где я пытаюсь обнаружить символ "兒", но 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("兒")) {

Кроме того, не стесняйтесь предложить более элегантный способ разобрать это...

[ОБНОВЛЕНИЕ] Некоторые картинки из отладчика, показывающие, что он не совпадает, хотя и должен. Я вставил китайский символ из таблицы, которую я использую в качестве входных данных, поэтому я не думаю, что это проблема копирования и вставки (если только в процессе не теряется юникод)

о черт, видимо не получается просто скопировать и вставить

3 ответа

Использование CharSequence.codePoints(), который возвращает поток кодовых точек, вместо того, чтобы иметь дело с символами:

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

(Конечно, вы могли бы использовать tmpChar.codePoints().filter(c -> c == '兒').forEach(c -> { /* ... */ })).

Либо персонажи, принимающие в качестве подстроки.

String s = ...;
if (s.contains("兒")) { ... }
int position = s.indexOf("兒");
if (position != -1) {
    int position2 = position + "兒".length();
    s = s.substring(0, position) + "*" + s.substring(position2);
}
if (s.startsWith("兒", i)) {
    // At position i there is a 兒.
}

Или кодовые точки, где это будет одна кодовая точка. Поскольку это не очень просто, переменная подстрока кажется хорошей.

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

Это твоя проблема. Only только один символ UTF-16. Многие китайские иероглифы могут быть представлены в UTF-16 в одной кодовой единице; Java использует UTF-16. Однако другие символы - это две единицы кода.

Есть множество API на String класс для совладания.

Как предлагается в другом ответе, получение IntStream от codepoints позволяет получить 32-битную кодовую точку для каждого символа. Вы можете сравнить это со значением кодовой точки для символа, который вы ищете.

Или вы можете использовать библиотеку ICU4J с более богатым набором средств для всего этого.

Другие вопросы по тегам