UTF-8 в Unicode преобразование - PullRequest
0 голосов
/ 16 января 2011

У меня проблемы с преобразованием 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 

Спасибо, Sandeep

Ответы [ 4 ]

2 голосов
/ 16 января 2011

Похоже, вы получаете UTF-16 в формате с прямым порядком байтов:

ff fe 41 00 ...

Что означает U + FEFF (ZWNBSP или знак порядка байтов), U + 0041 (латинская заглавная буква A), ...

Затем вы прекращаете печать, потому что ваш цикл while завершился с первым нулевым байтом. Следующие байты должны быть: 42 00.

Вы должны либо вернуть длину из вашей функции, либо убедиться, что вывод завершается нулевым символом (U + 0000) и повторяется до тех пор, пока вы не найдете это.

0 голосов
/ 16 января 2011

Если я не пропустил что-то, поскольку никто еще не указал на это, 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 Little Endian), который должен соответствовать внутренней кодировке Windows "Unicode".

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

Однако вам явно рекомендуется явно указывать UCS2-LE или UCS2-BE, если только первые байты не являются меткой порядка байтов (BOM) значением 0xfeff для указания схемы порядка байтов.

=> Вы видите спецификацию в качестве первых байтов выходных данных, потому что именно это означает название кодировки "UNICODE", это означает UCS2 с заголовком, указывающим схему порядка байтов.

0 голосов
/ 16 января 2011

UTF не является Unicode. UTF - это кодировка целых чисел в стандарте Unicode. Вопрос как таковой не имеет смысла. Если вы имеете в виду, что хотите преобразовать (любой) UTF в кодовую точку Юникода (то есть целое число, которое обозначает назначенную кодовую точку, примерно символ), то вам нужно немного прочесть, но это требует сдвига битов. значения 1, 2, 3 или 4 байтов в последовательности байтов UTF-8 (см. Википедия , в то время как Текст Маркуса Куна также превосходен)

0 голосов
/ 16 января 2011

UTF-8 - это Unicode.

Вам не нужно скрывать, если вам не нужен какой-либо другой тип кодировки Unicode, например UTF-16 или UTF-32

...