2017-05-26 4 views
0

私はBMP範囲外のUnicodeをテストしようとしています。以下では、例の文字として+ UD834DF01を使用し、それをマルチバイト文字に変換しようとしましたが、プログラムは失敗し、「Illegal byte sequence」と表示されます。なぜですか?wctomb失敗:不正なバイトシーケンス

#include <stdio.h> 
#include <wchar.h> 
#include <locale.h> 
#include <stdlib.h> 
#include <limits.h> 

int main(int argc, const char *argv[]) 
{ 
    setlocale(LC_ALL, ""); // my locale is UTF-8 

    wchar_t wc = 0xd834df01; 
    char bytes[MB_LEN_MAX] = {0}; 
    int r = wctomb(bytes, wc); 
    if (r > 0) { 
     for (int i = 0; i < MB_LEN_MAX; i++) 
      printf("0x%x\n", bytes[i]); 
    } else { 
     perror("fail"); 
    } 

    return 0; 
} 

答えて

1

16進数D834DF01は有効なUnicodeコードポイントではありません。 110000を超える値はありません。 (シーケンスの2つの) 'サロゲート'コード単位D834とDF01は、コード文字U + 10D301をコード化しており、標準文字ではなくプライベート使用領域にありますが、UTF-8で有効にエンコード可能ですUTF-16はWindowsのほとんど、Javaのほとんどすべて、および他の場所で使用されています。

訂正:私は頭の中で代理変換を行い、hexitをスリップしました。コメントとして、それは実際にU + 1D301 digram for heavenly earth Tai Xuan Jingにあります。

+0

gccはUnicodeコードポイントを表すのにwchar_tを使用していますか? – noinput

+0

私はlibiconvを試しましたが、私の結果はU + 01D301とUTF-8です。0xf0 0x9d 0x8c 0x81 – noinput

+0

@noinput:ワイド文字/文字列のサポートはコンパイラではなくCライブラリです。glibcは現代のUnicodeすなわちUCS- 4。あなたは1D301について正しいです、編集を参照してください。 –

関連する問題