2017-04-22 4 views
0

UTF-16 인코딩으로 작성된 이진 모드의 파일을 읽고 UNICODE 코드 포인트로 변환해야합니다. U + 0000..U + FFFF 간격에서 코드 포인트를 성공적으로 매핑하는 데 아무런 문제가 없었습니다. 문제는 U + 10000에서 U + 10FFFF까지 UTF-16 인코딩은 두 조각을 사용하여 코드 포인트를 형성한다는 것입니다.C 코드를 사용하여 UTF-16 파일에서 유니 코드 코드 지점을 매핑하는 방법

예 :이 로켓은 유니 코드 코드 포인트 : U + 1F680을 형성하는 0xD83D 0xDE80으로 UTF-16으로 인코딩됩니다.

UTF-16 인코딩은 UIC 0000에서 U + FFFF까지의 UNICODE 코드 포인트와 정확히 같은 번호이므로 UTF-16을 UNICODE 코드 포인트로 간단히 변환하는 코드를 작성했습니다. 문제는 U + 10000 이후이고, 프로그램은 첫 번째 부분 (D83D)을 간격 U + 0000에서 U + FFFF까지 이해하기 때문에 앞으로 진행됩니다.

어떻게이 오류를 피할 수 있습니까? 유니 코드 Codepoint를 성공적으로 구성하려면 읽는 부분에 조각이 하나 더 있어야한다는 것을 알기 위해 코드를 작성하려면 어떻게해야합니까?

미리 감사드립니다.

+1

이 거짓 "UTF-16 인코딩을 정확하게 간격에서 UNICODE 코드 포인트와 동일한 개수 U + 0000 U에 + FFFF ". UTF-16 0xD800 ~ 0xDFFF는 유니 코드 U + 10000을 나타내는 [surrogates] (https://en.wikipedia.org/wiki/UTF-16#U.2BD800_to_U.2BDFFF)입니다. –

답변

2

누락 된 검색어는 "서로 게이트 쌍"입니다. 다음 코드는 오류 검사 또는 범위 검사를 수행하지 않습니다.

int next_codepoint(uint16_t *text) { 
    int c1 = text[0]; 
    if (c >= 0xd800 && c < 0xdc00) { 
     int c2 = text[1]; 
     return ((c1 & 0x3ff) << 10) + (c2 & 0x3ff) + 0x1000; 
    } 
    return c1; 
} 

이는 UTF-16에서 유니 코드 웹 사이트에서 무료로 사용할 수 있습니다 Unicode 사양뿐만 아니라 위키 백과 문서에 설명되어 있습니다. iconv와 같이 코덱 변환에 사용할 수있는 라이브러리가 많이 있습니다. 도움이된다면 UTF-16을 UTF-32로 변환하려고합니다.