2013-04-13 4 views
5

Unicode Normalization FAQ 다음 내용이 포함유니 코드 정규화 양식 NFC 및 NFD를 사용해야하는 경우?

프로그램은 항상 동일으로 정규-해당하는 유니 코드 문자열을 비교해야을 ... 유니 코드 표준이 사용할 수 있습니다 잘 정의 된 정규화 형태로 제공 : NFC와 NFD를.

및 계속 ...

사용의 선택은 특정 프로그램이나 시스템에 따라 달라집니다. NFC는 레거시 인코딩에서 변환 된 문자열과 더 호환되므로 일반 텍스트에 가장 적합한 형식입니다. ... NFD와 NFKD는 내부 처리에 가장 유용합니다.

내 질문은 : NFC 최선하게 무엇

"일반 텍스트를." "내부 처리"를 정의하는 이유는 무엇이며 NFD에 가장 적합한 이유는 무엇입니까? 그리고 마지막으로, "최고"라는 것을 결코 언급하지 않고, 두 개의 문자열이 동일한 정규화 형식을 사용하여 비교되는 한 두 형식을 바꿀 수 있습니까?

+0

«레거시 인코딩에서 변환 된 문자열과 더 호환되기 때문에 NFC는 일반 텍스트에 가장 적합한 형식입니다. ... NFD와 NFKD는 내부 처리에 가장 유용합니다.»다소 가짜 진술입니다. 레거시 문자열은 유니 코드로 변환 할 때 NFC 형식으로 제공 될 수 있지만 향후 유지 관리를 위해 (예기치 않은 조건에서 코드가 사용되는 경우) NF [CD]로 명시 적으로 변환하는 것이 좋습니다. – ninjalj

답변

1
  1. NFC는 사용해야하는 일반적인 상식이며 ä은 1 코드 포인트이며 의미가 있습니다.

  2. NFD는 특정 내부 처리에 적합합니다. 액센트를 구분하지 않고 검색하거나 정렬하려면 NFD에서 문자열을 사용하면 훨씬 쉽고 빠릅니다. 또 다른 용도는 더 강력한 슬러그 타이틀을 만드는 것입니다. 이것들은 단지 가장 명백한 것들이며, 나는 많은 용도가 있음을 확신합니다. 다음

  3. 두 개의 문자열 x와 y는 표준 등가물 인 경우,
    toNFC (X) = toNFC (Y)
    toNFD (X) = toNFD (y)는

    그게 무엇 의미 한거야?

+1

다시 3, 나는 그것이 항상 사실이라고 생각하지 않습니다. 예 : (위키 피 디아에서) 문자열 1은 "U + 212B"(Å 문자)를 포함하고, 문자열 2는 "U + 0041 U + 030A"(라틴 문자 "A"와 "°"이상의 결합 링)를 포함합니다. NFD에서 그들은 동일하지만 NFC 문자열 2는 "U + 00C5"(스웨덴 문자 "Å")로 변환되므로이 둘은 동일하지 않습니다. NFD가 가장 안전한 선택 인 것 같습니다. http://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms – Aurimas

+0

@Aurimas 유니 코드 웹 사이트 http://www.unicode.org/reports/tr15/tr15-18.html – Esailija

+0

당신은 절대적으로 맞습니다. 이 문제에 대해 더 읽은 후에 내 의견을 바꾸려합니다. 여기서 핵심은 NFC로 이동하려면 먼저 NFD로 변환해야한다는 것입니다. – Aurimas

6

자주 묻는 질문은 "should"를 사용하고 동일한 요구 사항을 일관성없이 사용하는 것부터 시작됩니다. 유니 코드 표준 자체 (FAQ에 인용)가 더 정확합니다. 기본적으로 프로그램이 정규적으로 동등한 문자열을 다르게 취급한다고 기대해서는 안되지만 모든 프로그램이 동일한 것으로 간주해야한다고 생각해서는 안됩니다.

실제로는 소프트웨어가 수행해야하는 작업에 따라 다릅니다. 대부분의 상황에서는 전혀 정규화 할 필요가 없으며 정규화는 데이터의 필수 정보를 파괴 할 수 있습니다.

예를 들어, U + 0387 GREEK ANO TELEIA (·)는 U + 00B7 MIDDLE DOT (·)과 동일한 정식으로 정의됩니다. 문자는 정말 뚜렷하고 다르게 렌더링되어야하고 처리시 다르게 취급되어야하기 때문에 이것은 실수였습니다. 그러나 유니 코드의이 부분이 돌로 새겨 져 있기 때문에 그것을 변경하기에는 너무 늦었습니다. 따라서 데이터를 NFC로 변환하거나 정규적으로 동일한 문자열 사이의 차이를 무시하면 잘못된 문자가 표시 될 위험이 있습니다.

님이 걸릴 위험이 있으므로은 정규화하지 않습니다.예를 들어, 문자 "ä"는 단일 유니 코드 문자 U + 00E4 라틴 소문자 A로 표시되거나 두 유니 코드 문자 U + 0061 라틴 소문자 A U + 0308 결합 단점으로 나타날 수 있습니다. 대부분 전자, 즉 사전 작성된 양식이지만 후자이고 "ä"가 포함 된 데이터에 대한 코드 테스트의 경우 미리 작성된 양식 만 사용하면 후자를 감지하지 못합니다. 그러나 많은 경우에 그러한 일을하지 않고 단순히 데이터를 저장하고, 문자열을 연결하고, 인쇄하는 등의 작업을 수행합니다. 그러면 두 표현이 다소 다른 렌더링을 초래할 위험이 있습니다.

소프트웨어가 문자 데이터를 어떻게 든 다른 소프트웨어로 전달하는지 여부도 중요합니다. 수신자는 순전 한 가정이나 의식적으로 그리고 문서화 된 방식으로 입력이 정상화 될 것으로 기대할 수 있습니다.

+1

'U + 0061 라틴 소문자 A U + 0308 결합 대사'가 "ä"를 표현하는 방법은 NFD의 특정 버전이 필요한 맥 오에스텐 파일 이름이 될 것입니다. – hippietrail

+0

@hippietrail은 어딘가에 기록되어 있습니까? – Keith4G

+1

@ Keith4G : SO에 관한 질문이 있어야합니다. 내가 너를 찾아 볼게. 나는 Mac 녀석이 아니지만 몇 년 전에 재미를 위해 Mac 파티션을 읽으려고 몇 가지 작업을 수행하고이 문제에 직면했습니다. – hippietrail