我想打印所有可能的UTF-8值。类似的东西:计算utf8的所有可能值
uint32_t max = 0xFFFFFFFF;
for (uint32_t i = 0; i <= max; i++)
{
std::cout << std::hex << i << std::endl;
}
但我打印了很多不可能的情况。有什么更好的想法
我想打印所有可能的UTF-8值。类似的东西:计算utf8的所有可能值
uint32_t max = 0xFFFFFFFF;
for (uint32_t i = 0; i <= max; i++)
{
std::cout << std::hex << i << std::endl;
}
但我打印了很多不可能的情况。有什么更好的想法
我不知道你为什么会想这样做,但在这里你去:
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));
谢谢。我想在每个可能的utf-8可打印值的像素中预先存储一个数组在我的程序中,但是我认为有很多可能的情况。 –
@XabiE:这没有意义。你应该让自己更熟悉Unicode。有像组合字符等东西。文本渲染是一个复杂的主题,你最好的选择是查询你的文本渲染引擎的字符串的大小。 – ybungalobill
我知道,但不幸我不能这样做。渲染引擎是在没有通讯的另一个处理器中,我需要在我的GUI中绘制它之前拆分我的消息,所以我认为可能的解决方案是预计算任何可能的utf8字符的宽度并将这些信息存储在数组中。 –
究竟你“不可能的情况”是什么意思? – SingerOfTheFall
您是否阅读过例如。维基百科(并理解它)?因为你的代码是无稽之谈(如果你想打印所有可能的utf8字节元组)。维基百科清楚地描述了对于什么字节长度存在什么限制 – deviantfan
在UTF-8中,星号为0x10的所有字符都是以一个字节表示的一个utf8-char的延续。 Forr示例11100100 10xxxxx它是有效的情况,但是11100100 11xxxxx它是无效的,例如。 –