2016-09-25 4 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, являются продолжениями одного utf8-char, представленного более чем в 1 байт. Например, пример 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: это не имеет смысла. Вы должны более подробно ознакомиться с Unicode. Есть такие вещи, как комбинирование символов и т. Д. Текстовый рендеринг - сложный вопрос, и лучше всего спросить свой движок текстового рендеринга, каковы размеры строк. – ybungalobill

+0

Я знаю, но к несчастью я не могу этого сделать. Механизм рендеринга находится в другом процессоре без связи, и мне нужно разделить мои сообщения, прежде чем нарисовать его в моем графическом интерфейсе, поэтому я думаю, что возможное решение coluld должно быть предварительно оценено шириной любого возможного char utf8 и хранить эту информацию в массиве, например. –

Смежные вопросы