C++ 计算utf8的所有可能值

C++ 计算utf8的所有可能值,c++,c++11,utf-8,C++,C++11,Utf 8,我想打印所有可能的UTF-8值。类似于此: uint32_t max = 0xFFFFFFFF; for (uint32_t i = 0; i <= max; i++) { std::cout << std::hex << i << std::endl; } uint32\u t max=0xFFFFFFFF; 对于(uint32_t i=0;i我不知道您为什么要这样做,但现在开始: int i = 0; for(; i

我想打印所有可能的UTF-8值。类似于此:

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

对于(uint32_t i=0;i我不知道您为什么要这样做,但现在开始:

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));
inti=0;
对于(;i<0x80;++i)//0xxxxxxx
printf(“%.2x\n”,i);
对于(;i<0x800;++i)//110xxxxx 10xxxxxx
printf(“%.2x%.2x\n”,0xc0 |(i>>6),0x80 |(i&0x3f));
对于(;i<0x10000;++i)//1110xxxx 10xxxxxx 10xxxxxx
如果(i<0xd800 | | i>=0xe000)//跳过代理项
printf(“%.2x%.2x%.2x\n”,0xe0 |(i>>12),0x80 |((i>>6)和0x3f),0x80 |(i>>0x3f));
对于(;i<0x110000;++i)//11110xxx 10xxxxx 10xxxxx 10xxxxx 10xxxxx
printf(“%.2x%.2x%.2x%.2x%2x\n”,0xf0 |(i>>18),0x80 |((i>>12)和0x3f),0x80 |((i>>6)和0x3f),0x80 |(i和0x3f));

你所说的“不可能的情况”到底是什么意思?你读过Wikipedia(并理解了它)吗?因为你的代码是胡说八道(如果你想打印所有可能的utf8字节元组).Wikipedia清楚地描述了UTF-8中的字节长度存在哪些限制,所有以0x10开头的字符都是一个utf8字符的延续,用超过1个字节表示。例如,11100100 10xxxxx是有效的,但11100100 11xxxxx是无效的。这需要一段时间……这是典型的XY问题。请询问你的问题,而不是你提出的解决方案(这是行不通的)。谢谢。我想在我的程序中存储一个数组,每个可能的utf-8可打印值的预标定宽度(以像素为单位),但我认为有很多可能的情况。@XabiE:这没有意义。你应该更熟悉Unicode。有一些东西像字符组合等。文本呈现是一个复杂的主题,而且很复杂我们最好的办法是查询您的文本呈现引擎字符串的大小。我知道,但不幸的是我不能这样做。呈现引擎位于另一个没有通信的处理器中,我需要在GUI中绘制消息之前拆分消息,因此我认为一个可能的解决方案可以预先计算任何可能的utf8字符和stor的宽度例如,在数组中删除这些信息。@XabiE:这根本行不通。但如果您坚持,欢迎您按自己的方式来做。@XabiE:不要。不,说真的,不要。这行不通。计算字符串的宽度是way(way)更复杂的是,这比对单个代码点的宽度求和更重要。例如,对于分解的字符,它将失败,并且某些脚本单独呈现的字符与在word中使用时呈现的字符不同。然后,您的文本呈现引擎将应用字距调整。现在,所有赌注都已取消。您最好选择
return 721;
。On一般来说,这可能和你精心策划的失败一样准确。