2016-09-25 5 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バイト以上で表される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:これは意味をなさない。あなたはUnicodeにもっと精通している必要があります。文字を組み合わせるようなものがあります。テキストレンダリングは複雑なテーマです。文字レンダリングエンジンに文字列のサイズを照会するのが一番の方法です。 – ybungalobill

+0

私は知っていますが、残念ながら私はこれを行うことはできません。レンダリングエンジンはcomunicationのない別のプロセッサーにあり、GUIに描画する前にメッセージを分割する必要があるので、考えられる解決方法は可能なutf8 charの幅を事前に計算してこの情報を配列に格納するなどと考えます。 –

関連する問題