2016-09-25 69 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的延续。 Forr示例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

我知道,但不幸我不能这样做。渲染引擎是在没有通讯的另一个处理器中,我需要在我的GUI中绘制它之前拆分我的消息,所以我认为可能的解决方案是预计算任何可能的utf8字符的宽度并将这些信息存储在数组中。 –