2011-08-24 6 views
18

수많은 유니 코드 문자에서 두 개의 'f'문자에 대한 U + FB00 합자 ff와 같이 실제로 두 개 이상의 문자를 나타내는 문자가 있습니다. 이러한 문자를 여러 개의 단일 문자로 쉽게 변환 할 수 있습니까? 표준 Java API에서 사용할 수있는 것이 좋지만 필요한 경우 외부 라이브러리를 참조 할 수 있습니다.유니 코드 합자 문자 분리

+1

나는 키워드 * 합자 *를 귀하의 질문에 추가 할 자유를했습니다. :) – deceze

+0

감사합니다 - 나는 그들이 무엇이라고 불렀는지 잘 몰랐다. :-) – nonoitall

+1

기본 단위에 대한 제자가 아니십니까? –

답변

19

U + FB00은 호환성 문자입니다. 일반적으로 유니 코드는 합자에 대한 별도의 코드 포인트를 지원하지 않습니다 (합자를 사용해야하는 경우와 레이아웃을 결정할 때 데이터가 저장되는 방식에 영향을주지 않아야한다고 주장합니다). A 중 일부는 아직까지 do이 별도의 엔터티로 합자를 나타내는 이전 인코딩과의 왕복 변환 호환성을 허용하기 위해 존재합니다.

운 좋게도, 합자가 을 나타내는 정보는 Unicode data file에 존재하는이고, 대부분의 가능한 문자열 처리 시스템에는 데이터가 내장되어 있습니다. 자바에서

, 당신은 the Normalizer class를 사용해야합니다 및 NFKC 형태 :

String ff ="\uFB00"; 
String normalized = Normalizer.normalize(ff, Form.NFKC); 
System.out.println(ff + " = " + normalized); 

ff = ff
+0

굉장! 감사! – nonoitall

+4

@nonoitall : NFKD는 아무런 만능병이 아닙니다 : 많은 합자 및 다른 개념으로 결합 된 양식이 있습니다 ** 전혀 작동하지 않습니다 ** 예를 들어, * ß * 또는 * ẞ *를 * SS * (심지어 거기에 casefold thither!), * * * * AE * 또는 * A * * 또는 * OE * 또는 * - * oe * * * * * ae *. 또한 * * 또는 * đ *를 * d * 또는 * ø *로 * o *로 바꾸는 것은 쓸모가 없습니다. ** 모든 ** ** 해당 사항에 대해 UCA (Unicode Collation Algorithm)가 필요합니다 ** ** NFKD가 아닙니다. NFD/NFKD는 또한 싱글 톤을 파괴하는 성가신 속성을 가지고 있습니다. – tchrist

+5

@ tchrist : 제 이해는 여러분이 언급 한 분해가 수행되어서는 안된다는 것입니다. 인쇄상의 의미에서 단순히 합자가 아니라 다르게 사용되는 실제 분리 된 문자입니다. ß *는 필요할 경우 (예 : ASCII 만 저장할 수있는 경우) ss로 분해 될 수 있지만 ** 같은 것은 아닙니다 **. 반면에 ff 리 거의 쳐는 타이포 그래픽 합자입니다. –

1

java.text.Normalizer을 시도해 볼 수는 있지만 합자에 해당하는지 잘 모르겠습니다.

+0

이 링크는 질문에 대답 할 수 있지만 답변의 핵심 부분을 여기에 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. - [검토 중] (리뷰/저품목 게시물/18866472) – pirho

4

당신이 정상화라고 얘기하고에 지정된 절차를 인쇄합니다 Unicode Normalization Forms 기술 노트.

java.text.Normalizer이라는 Java SE 클래스 라이브러리에이 프로세스를 구현하는 클래스가 있습니다. 그러나 위에 링크 된 유니 코드 문서를 읽고 원하는 결과를 얻기 위해 사용해야하는 "정규화 양식"을 찾아야합니다. 그것은 간단하지 않습니다 ....