Сравните китайские юникодные строки, когда несколько кодовых точек имеют одинаковый символ? - PullRequest
5 голосов
/ 21 марта 2012

Я пишу некоторый код Java, который имеет дело с китайскими символами, и я получил некоторые неожиданные результаты - строки, которые должны быть равны, не были. Вот один из оскорбительных символов, что означает «шесть» (пиньинь: liù): 六. Этот символ может быть представлен любой из двух кодовых точек:

F9D1 в блоке: Идеограммы совместимости CJK
516D в блоке: CJK Унифицированные идеографы

В Википедии есть страница об этих диапазонах символов, а в коротком разделе об идеограммах совместимости упоминаются некоторые дубликаты, но в этом списке этот конкретный символ пропущен.

Вот мне и интересно:

  1. Есть ли где-нибудь список повторяющихся символов Юникода, чтобы я мог преобразовать строки перед тем, как сравнивать их?
  2. Это нормально, когда имеешь дело с символами CJK, или я сделал что-то еще не так?

1 Ответ

3 голосов
/ 21 марта 2012

Просто нормализуй их.U + F9D1 становится U + 516D в соответствии с любой из четырех схем нормализации:

$ export PERL_UNICODE=S

$ perl -le 'print "\x{F9D1}\x{516D}"' | uniquote -v
\N{CJK COMPATIBILITY IDEOGRAPH-F9D1}\N{CJK UNIFIED IDEOGRAPH-516D}

$ perl -le 'print "\x{F9D1}\x{516D}"' | nfd | uniquote -v
\N{CJK UNIFIED IDEOGRAPH-516D}\N{CJK UNIFIED IDEOGRAPH-516D}
$ perl -le 'print "\x{F9D1}\x{516D}"' | nfc | uniquote -v
\N{CJK UNIFIED IDEOGRAPH-516D}\N{CJK UNIFIED IDEOGRAPH-516D}
$ perl -le 'print "\x{F9D1}\x{516D}"' | nfkd | uniquote -v
\N{CJK UNIFIED IDEOGRAPH-516D}\N{CJK UNIFIED IDEOGRAPH-516D}
$ perl -le 'print "\x{F9D1}\x{516D}"' | nfkc | uniquote -v
\N{CJK UNIFIED IDEOGRAPH-516D}\N{CJK UNIFIED IDEOGRAPH-516D}

Многие необходимые инструменты Unicode, в том числе, доступны здесь .

...