2011-01-16 14 views
-1

UTF-8からUnicodeへの変換に問題があります。UTF-8からUnicodeへの変換

以下

コードです:)(メイン

int charset_convert(char * string, char * to_string,char* charset_from, char* charset_to) 
{ 
    char *from_buf, *to_buf, *pointer; 
    size_t inbytesleft, outbytesleft, ret; 
    size_t TotalLen; 
    iconv_t cd; 

    if (!charset_from || !charset_to || !string) /* sanity check */ 
     return -1; 

    if (strlen(string) < 1) 
     return 0; /* we are done, nothing to convert */ 

    cd = iconv_open(charset_to, charset_from); 
    /* Did I succeed in getting a conversion descriptor ? */ 
    if (cd == (iconv_t)(-1)) { 
     /* I guess not */ 
     printf("Failed to convert string from %s to %s ", 
       charset_from, charset_to); 
     return -1; 
    } 
    from_buf = string; 
    inbytesleft = strlen(string); 
    /* allocate max sized buffer, 
     assuming target encoding may be 4 byte unicode */ 
    outbytesleft = inbytesleft *4 ; 
    pointer = to_buf = (char *)malloc(outbytesleft); 
    memset(to_buf,0,outbytesleft); 
    memset(pointer,0,outbytesleft); 

     ret = iconv(cd, &from_buf, &inbytesleft, &pointer, &outbytesleft);ing 
    memcpy(to_string,to_buf,(pointer-to_buf); 
} 

int main() 
{  
    char UTF []= {'A', 'B'}; 
    char Unicode[1024]= {0}; 
    char* ptr; 
    int x=0; 
    iconv_t cd; 

    charset_convert(UTF,Unicode,"UTF-8","UNICODE"); 

    ptr = Unicode; 

    while(*ptr != '\0') 
    { 
     printf("Unicode %x \n",*ptr); 
     ptr++; 
    } 
    return 0; 
} 

それはAを与え、Bが、私は取得していなければならない:

ffffffff 
fffffffe 
41 

おかげで、 サンディープ

+4

質問を少し修正できますか?それはまったく読めない。さらに、「UTF-8からUnicodeへの変換」は意味をなさない。 Unicodeは仕様であり、UTF-8はUnicode関連のフィールドで使用するためのデータを格納する "形式"です。 – soc

+0

あなたはそれが何であるかを理解しようとしましたか、どこからでもコピーしましたか(どこに行番号から見ても)? – soc

+0

Thanks Soc、 私は以下のリンクを辿り、Unicodeバイナリ表現と対応するUTF-8が異なるかどうかを理解しようとしていました。 – sandeep

答えて

0

UTF-8 i ■Unicode。

あなたはUTF-16などのUnicodeエンコーディングの他のいくつかのタイプを必要としない限り、あなたはひそかにする必要はありません、またはUTF-32

+2

UTF-8はUnicodeの一部です。 – BlackBear

+0

@BlackBear:彼はそれを知っていると思うし、それは彼のポイントではない。 downvoteする理由はありません。 – soc

+0

@Artyom:私はあなたを下降させませんでした。私は失礼や誤った答えだけを下降させます。 – BlackBear

0

UTFは、Unicodeではありません。 UTFは、Unicode標準の整数のエンコーディングです。疑問は、そのままでは意味がありません。あなたが(任意の)UTFからユニコード・コード・ポイント(つまり、割り当てられたコード・ポイント、およそ文字を表す整数)に変換することを意味するならば、読取りを少し行う必要がありますが、ビットシフトUTF-8バイトシーケンス(1,を参照してください。Markus Kuhn'sのテキストも優れています)の1,2,3または4バイトの値は

2

リトルエンディアン形式で出力されているようです。 U + FEFF(バイトオーダーマーク別名ZWNBSP)、U + 0041(ラテン大文字A)である

ff fe 41 00 ... 

、...

あなたはその後、PRIを停止あなたのwhileループが最初のnullバイトで終了したためです。次のバイトは、42 00でなければなりません。

関数から長さを戻すか、出力がヌル文字(U + 0000)で終わっていることを確認し、見つかるまでループしてください。

+0

もちろん、正しいですが、私はあなたの答えが理にかなっている前にクリアする必要がOPの質問に深い概念的な問題があると思います。いずれにせよ、upvote。 –

0

まだ誰も指摘していないものがない限り、「UNICODE」はlibiconvの有効なエンコーディング名ではないため、エンコーディングファミリの名前です。

http://www.gnu.org/software/libiconv/

(編集)実際iconv -lは、列挙されたエントリとしてUNICODEを示しているが、そのUNICODE-LITTLEの別名として、それが言及subnotesにノートのソースコードには詳細は、表示されない:

lib/aliases.gperf:UNICODELITTLE, ei_ucs2le 

すなわちUCS2-LE(UTF-16リトルEndi:別名で

* UNICODE (big endian), UNICODEFEFF (little endian) 
    We DON'T implement these because they are stupid and not standardized. 

は、次のようにUNICODELITTLE(ハイフンなし)が解決ファイルヘッダWindowsの内部 "Unicode"エンコーディングと一致するはずです。あなたがはっきりと明示的にUCS2-LEかを指定することが推奨されているが

http://en.wikipedia.org/wiki/UTF-16/UCS-2

UCS2-BE最初のバイトはバイト順スキームを示すためにByte Order Mark(BOM)値0xfeffある場合を除きます。

=> "UNICODE"というエンコーディング名が意味するので、出力の最初のバイトとしてBOMが表示されます。これは、バイトオーダー方式を示すヘッダーを持つUCS2を意味します。

関連する問題