2011-12-20 2 views
5

저는 C++ 라이브러리로 작업 중이며 UTF-8 코드 포인트에서 서명되지 않은 char을 생성해야합니다. 예를 들어 코드 포인트가 decimal 610 ('latin letter small capital G') 인 경우 C++에서 어떻게 작성합니까?C++ : UTF-8 코드 포인트에서 unsigned char을 생성하는 방법

I 자바 스크립트, 나는 다음과 같은 작업을 수행 할 수

unsigned char temp = (unsigned char)610; 
// compiles, but 
Debug::WriteLine((int)temp); // outputs 98 (??) 

위의 자바 스크립트 예제와 같은 수행 C의 코드 예제 ++ 주시기 바랍니다 : 시도 ++ C에서

var temp = String.fromCharCode(610); 
console.log(temp); // Outputs a small 'G' (correct) 
var codePoint = temp.charCodeAt(0); 
console.log(codePoint); // Outputs 610 (correct) 

.

환경은 관리되는 C++이지만 제 3 자 라이브러리와 상호 작용할 때 CLR 유형을 사용하지 않는 것이 좋습니다.

+0

'Debug'의 유형은 무엇입니까? 'Debug '는 UTF를 인식합니까? C++ ostream은 그렇지 않기 때문입니다. UTF, 특히 UTF8로 많은 작업을 수행하려면 라이브러리가 필요합니다. –

+0

'unsigned char'는 최대 255까지만 값을 유지할 수 있습니다. 유니 코드 코드 포인트가 훨씬 커질 수 있습니다. 귀하의 문제는 잘 설명되어 있지 않습니다. –

+0

아,이 일을 할 수 있다면 인생은 훨씬 쉬워 질 것입니다 ..... –

답변

5

unsigned char은 (단지 0 내지 255의 값을 보유 할 수 숯불이 8 비트 폭 가정), 그래서 wrap around *

사용 char16_t 16을 저장한다 (610)의 값을 유지하도록 소형이고 -bit char (또는 UTF-8이 필요로하는 32 비트 char의 경우 char32_t).

char32_t temp = (char32_t)610; 
Debug::WriteLine(temp); // outputs 610 (!!) 

당신은 UTF-8 문자열를 사용 UTF-8 문자열 리터럴 처리하는 경우

u8"I'm a UTF-8 string." 

* 그것은 당신의 예에서도 두 번 주위를 감싸

을 :

610 - 256 - 256 = 98

+0

여기서'char16_t'와'char32_t'는 _codepoints_로 사용되고 있습니다. –

+0

@MooingDuck, 당신은'char16_t'가 모든 코드 포인트를 수용하기에 충분히 크지 않으며 그 목적을 위해 피해야한다는 것을 잊었습니다. 'char16_t'의 문자열은 Windows가 요구하는대로 UTF-16을 저장하는 데 사용될 수 있습니다. –

3

유니 코드 코드 포인트에는 32 비트 표현이 필요할 수 있습니다. 대부분의 서양 언어에서는 16 비트이면 충분하지만 가능한 모든 유니 코드 코드 포인트를 처리하려면 실제로 32 비트가 필요합니다.

uint32_t codePoint = someString.CodePointAt(x); 

당신은 여기에 대한 자세한 내용을보실 수 있습니다 : http://en.wikipedia.org/wiki/Code_point.

+0

유니 코드는 최대 21 비트를 사용합니다.17-31 비트의 데이터를 나타낼 수있는 숫자 데이터 유형이 없으므로 21 비트 데이터를 나타 내기 위해 32 비트 숫자 유형이 필요합니다. –

0

당신은 당신이 할 수있는 유니 코드 코드 포인트 (610)의 UTF-8 표현에 서명 숯불 가리키는 만들려면 의미하는 경우 :

char unsigned temp[] = { 0xc9, 0xa2 }; 
관련 문제