Как сравнить китайские иероглифы в 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 с более богатым набором средств для всего этого.