2012-03-20 2 views
4

한자를 다루는 Java 코드를 작성 중입니다. 예기치 않은 결과가 나타납니다. 동일해야하는 문자열은 그렇지 않습니다. 다음은 "six"(pinyin : liù)을 의미하는 잘못된 문자 중 하나입니다. 블록의여러 코드 포인트가 같은 문자 인 경우 중국어 유니 코드 문자열을 비교합니까?

F9D1 : 블록의 CJK Compatibility Ideographs
516D : CJK Unified Ideographs

위키 백과는 이러한 문자 범위에 대한 page 및 호환성 표의 문자의 짧은 부분을 가지고이 문자는 두 개의 코드 포인트 중 하나를 사용하여 나타낼 수있다 몇 가지 중복을 언급하지만, 목록은이 특정 문자를 생략합니다.

그래서 궁금하네요 :

  1. 중복 된 유니 코드 문자의 목록 어딘가 그래서 내가 그들을 비교하기 전에 문자열을 변환 할 수 있습니까?
  2. CJK 문자를 다룰 때는 정상입니까? 아니면 다른 것을 잘못 했습니까?

답변

2

그냥 정상화하십시오. 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} 

많은 필수 유니 코드 도구, here 사용할 수 있습니다.

+0

감사합니다. java.text.Normalizer 클래스에서 Java에 상응하는 것을 발견했습니다. –

+0

@RobN 예, 정확하게. 미안해, 그 말은하지 않았다. 나는 그것이 당신이 이미 어디에 있었는지 알 것이라고 생각했다. 나는 정상화가 그것을 처리한다는 것을 보여 주려하고 있었다. – tchrist