2016-09-25 3 views
-3

가능한 모든 UTF-8 값을 인쇄하고 싶습니다. 이것과 비슷한 것 :utf8의 가능한 모든 값을 계산하십시오.

uint32_t max = 0xFFFFFFFF; 
    for (uint32_t i = 0; i <= max; i++) 
    { 
    std::cout << std::hex << i << std::endl;  
    } 

그러나 나는 많은 불가능한 경우를 인쇄하고 있습니다. 더 좋은 생각이야?

+1

정확하게 당신이 "불가능한 경우"에 의해 무엇을 의미합니까? – SingerOfTheFall

+3

예를 읽었습니까? 위키 백과 (그것을 이해하고)? 귀하의 코드가 말도 안되기 때문에 (가능한 모든 utf8 바이트 튜플을 인쇄하고 싶다면). 위키피디아는 바이트 길이에 대한 제한이 무엇인지 명확하게 설명합니다. – deviantfan

+0

UTF-8에서 0x10으로 별표 표시 한 모든 문자는 1 바이트 이상으로 표시된 하나의 utf8 문자의 연속입니다. 예 11100100 10xxxxx는 유효하지만 11100100 11xxxxx 예를 들어 유효하지 않습니다. –

답변

1

이 작업을 수행 할 왜 내가 모르겠지만, 여기 당신이 이동 :

int i = 0; 
for(; i < 0x80; ++i) // 0xxxxxxx 
    printf("%.2x\n", i); 
for(; i < 0x800; ++i) // 110xxxxx 10xxxxxx 
    printf("%.2x %.2x\n", 0xc0 | (i >> 6), 0x80 | (i & 0x3f)); 
for(; i < 0x10000; ++i) // 1110xxxx 10xxxxxx 10xxxxxx 
    if(i < 0xd800 || i >= 0xe000) // skip surrogates 
     printf("%.2x %.2x %.2x\n", 0xe0 | (i >> 12), 0x80 | ((i >> 6) & 0x3f), 0x80 | (i & 0x3f)); 
for(; i < 0x110000; ++i) // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
    printf("%.2x %.2x %.2x %.2x\n", 0xf0 | (i >> 18), 0x80 | ((i >> 12) & 0x3f), 0x80 | ((i >> 6) & 0x3f), 0x80 | (i & 0x3f)); 
+0

감사합니다. 내 프로그램에서 각 가능한 utf - 8 인쇄 가능한 값의 픽셀 단위로 미리 계산 된 너비를 가진 배열을 저장하려고하지만 생각할 수있는 많은 경우가 있습니다. –

+3

@XabiE : 이것은 이해가되지 않습니다. 유니 코드에 익숙해 져야합니다. 문자 결합과 같은 것들이 있습니다. 텍스트 렌더링은 복잡한 주제이고 가장 좋은 방법은 문자열 렌더링 엔진에 문자열의 크기를 쿼리하는 것입니다. – ybungalobill

+0

나는 알고있다. 그러나 불행히도 나는 이것을 할 수 없다. 렌더링 엔진은 comunication없이 다른 프로세서에 있고 내 GUI에서 그리기 전에 내 메시지를 분할해야합니다. 가능한 해결책은 가능한 모든 utf8 char의 너비를 미리 계산하여이 정보를 예를 들어 배열에 저장하는 것입니다. –

관련 문제