-1

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

4 に答える 4

2

リトルエンディアン形式でUTF-16を取得しているようです:

ff fe 41 00 ...

U+FEFF (ZWNBSP 別名バイト オーダー マーク)、U+0041 (ラテン大文字の A)、...

while ループが最初の null バイトで終了したため、印刷を停止します。次のバイトは次のようになります: 42 00.

関数から長さを返すか、出力がヌル文字 (U+0000) で終了していることを確認して、これが見つかるまでループする必要があります。

于 2011-01-16T12:06:32.050 に答える
0

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

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

(編集) 実際iconv -lには UNICODE をリストされたエントリとして表示しますが、詳細はありません。ソースコードでは、UNICODE-LITTLE のエイリアスとしてメモにリストされていますが、サブノートでは次のように言及されています。

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

エイリアス ヘッダー ファイルでは、UNICODELITTLE (ハイフンなし) は次のように解決されます。

lib/aliases.gperf:UNICODELITTLE, ei_ucs2le

つまり、UCS2-LE (UTF-16 リトル エンディアン) であり、Windows の内部 "Unicode" エンコーディングと一致する必要があります。

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

ただし、バイト オーダー スキームを示すために最初のバイトがバイト オーダー マーク(BOM) 値 0xfeff でない限り、明示的に UCS2-LE または UCS2-BE を指定することをお勧めします。

=> 出力の最初のバイトとして BOM が表示されます。これは、「UNICODE」エンコーディング名が意味するものであり、バイト オーダー スキームを示すヘッダーを持つ UCS2 を意味するためです。

于 2011-01-16T12:11:35.350 に答える
0

UTF-8 はユニコードです。

UTF-16 や UTF-32 などの他のタイプの Unicode エンコーディングが必要でない限り、変換する必要はありません。

于 2011-01-16T11:40:40.583 に答える
0

UTF は Unicode ではありません。UTF は、Unicode 標準における整数のエンコードです。質問は、そのままでは意味がありません。(任意の) UTF から Unicode コード ポイント (つまり、割り当てられたコード ポイントを表す整数、おおよそ文字) に変換する場合は、少し読み取る必要がありますが、ビット シフトが必要です。 UTF-8 バイト シーケンスの 1、2、3、または 4 バイトの値について ( Wikipediaを参照してください。Markus Kuhn のテキストも優れています) 。

于 2011-01-16T11:44:22.220 に答える