2013-08-01 8 views
0

코드에서 주석이 7F보다 큰 문자를 UTF-8로 변환한다고하는 다음 코드 조각이 있습니다. 이 코드에 다음과 같은 질문이 :문자를 UTF-8로 변환하는 논리

이 코드 작업을 수행하는 방법
if((const unsigned char)c > 0x7F) 
    { 
    Buffer[0] = 0xC0 | ((unsigned char)c >> 6); 
    Buffer[1] = 0x80 | ((unsigned char)c & 0x3F); 
    return Buffer; 
    } 
  1. ?
  2. 현재 사용중인 Windows 코드 페이지가 Buffer에있는 문자에 영향을 줍니까?
+2

1. 그것은 ... UTF-8 인코딩에 의해 정의 된대로 작동합니까? 그 밖에 어떻게? –

+0

@ R.MartinhoFernandes : 내 생각에 ..이 코드는 저에게 쓰여지지 않았습니다. 그것은 지금 당분간 일하고 있습니다. 그래서 나는 그게 맞을 것이라고 생각합니다. 나는 그 배후의 논리를 이해하고 싶었다. – Asha

+0

@Asha 그러면 utf-8 사양을 파헤쳐 야 할 것입니다. – Xaqq

답변

10

처음에는 코드가 작동하지 않습니다. 우연한 일치 인 경우 char (또는 unsigned char)의 인코딩은 ISO-8859-1이 첫 번째 256 유니 코드 코드 포인트와 동일한 코드 포인트를 가지고 있기 때문에 ISO-8859-1입니다. 그러나 ISO-8859-1에는 이 크게 ISO-8859-15에 의해 대체되었으므로 아마도 이 작동하지 않을 것입니다. (예를 들어, 0xA4을 위해 그것을 시도하십시오. ISO-8859-15의 유로 기호를. 그것은 당신에게 완전히 다른 문자를 제공 할 것입니다.) 가 따라 둘 중이 변환을 수행하는 두 올바른 방법이있다

( 은 인코딩에 에 따라 여러 버전의 코드가 필요할 수 있다는 것을 의미합니다). 가장 간단한 방법은 개의 문자열과 문자 당 하나의 배열을 갖는 배열을 사용하는 것입니다. 경우에는 if이 필요하지 않습니다. 다른 하나는 코드를 유니 코드 코드 포인트 (32 비트 UTF-32)로 변환하고 을 UTF-8로 변환하는 것입니다 (일부 문자의 경우 2 바이트 이상 필요합니다. 유로 문자는 0x20AC : 0xE2이고, 0x82, 0xAC).

편집 : http://www.cl.cam.ac.uk/~mgk25/unicode.html : UTF-8에 대한 좋은 소개는

. 제목에 따르면 은 Unix/Linux 용이지만 시스템이 있다면 거의 존재하지 않습니다. 특정 정보가 있습니다 (그러한 정보는 분명히 으로 표시되어 있음).