2013-11-27 3 views
2

정규적으로 동일한 유니 코드 문자열이 동일하게 정렬합니까? 때때로.strcoll의 유니 코드 정규화

#include <iostream> 
#include <cstring> 
#include <clocale> 
int main() 
{ 
    std::setlocale(LC_COLLATE, "en_US.UTF-8"); 
    if (std::strcoll("\xc3\xa9", "e\xcc\x81")) 
     std::cout << "FAIL: No Unicode normalization here" << std::endl; 
    else 
     std::cout << "WIN: Unicode normalization is performed" << std::endl; 
} 

내 Cygwin에서화된 Windows 시스템에 WIN에서이 프로그램의 결과, 나는 내 손을 얻을 수있는 모든 리눅스 시스템에 실패합니다.

이 예상되는 동작입니까? WIN을 생성하는 Linux 시스템이 있습니까? Mac OS X은 어떻습니까? FreeBSD?

타사 라이브러리와 정규화 및 동등한 작업을 수행 할 수 있음을 알고 있습니다. UTF-8 로켈의 표준 조합 규칙에 관심이 있습니다.

이 질문은 영감을 받아 this one입니다.

답변

1

내가 아는 한 C, C++, POSIX 표준 모두에서 유니 코드 표준화에 대한 언급은 없습니다.

따라서 구현은 정규화를 프로그래머가 명시 적으로 수행 할 수있는 것으로 남겨 둘 수 있습니다.

더 명확하게 glibc 유럽 로케일에서 분명히 정렬 알고리즘으로 ISO 14651을 사용합니다. Unicode Collation FAQ는 ISO 14651 정상화를하지 않는 것을 의미한다 : 정규 등가물의 균일 한 처리가 UCA와 ISO 14651.

+0

어느 기준이 언급 한'중 * .UTF-8' 로케일의 차이로 표시됩니다. 언어 표준은'C '로켈을 언급하고, POSIX는'POSIX' 로케일을 추가합니다. 나는 * .UTF-8 로케일에 관심이있다. 예, 구현에 특화된 것들이다. –

+0

그러면 의존 할 수없는 구현 관련 답변 만 얻을 수 있습니다. 어쨌든, 나는 C/Unix-y 행동이 암묵적으로 정규화를하지 않을 것이라고 기대한다. – ninjalj

+0

구현 관련 답변은 특정 구현 관련 질문에 대한 응답으로 기대하는 바입니다. 그것은 "리눅스"와 "cygwin"과 "en_US.UTF-8"을 공개적으로 말합니다. 이것들은 모두 구현 관련 사항입니다. 그 점을 잘못 보지 마라. –