Необходимо преобразовать 16-битные данные в 8-битные

0
int main()
{
    char str[200] = {0};
    char out[500] = {0};

    str[0]=0x00; str[1]=0x52; str[2]=0x00; str[3]=0x65; str[4]=0x00; str[5]=0x73; str[6]= 0x00; str[7]=0x74;

    for(int i=0;i<sizeof(str);i++)
    cout<<"-"<<str[i];
    changeCharEncoding("UCS-2","ISO8859-1",str,out,sizeof(out));
    cout<<"\noutput : "<<out;
    for(int i=0;i<sizeof(out);i++)
    cout<<":"<<out[i];
}

//encoding function
int changeCharEncoding(const char *from_charset, const char *to_charset, const char *input, char *output, int out_size)
{
    size_t input_len = 8;
    size_t output_len = out_size;
    iconv_t l_cd;
    if ((l_cd = iconv_open (to_charset, from_charset)) == (iconv_t) -1)
    {
            return -1;
    }
    int rc = iconv(l_cd, (char **)&input, &input_len, (char **)&output, &output_len);
    if (rc == -1)
    {
            iconv_close(l_cd);
            return -2;
    }
    else
    {
            iconv_close(l_cd);
    }
}

Пожалуйста, предложите мне способ конвертировать 16-битные данные в 8 бит. Я попробовал это с помощью iconv. Также предложите мне, если есть что-то еще, чтобы сделать то же самое.

Теги:
iconv

3 ответа

1

Похоже, вы пытаетесь преобразовать UTF-16 и UTF-8: попробуйте изменить свой вызов changeCharEncoding() на:

changeCharEncoding("UTF-16","UTF-8",str,out,sizeof(out));

Результатом вывода UTF-8 должно быть

刀攀猀琀

На стороне: в коде есть несколько вещей, которые вы должны улучшить. Например, changeCharEncoding как changeCharEncoding и main, чтобы вернуть int тогда как ваша реализация не выполняется.

  • 0
    Я думаю, что он хочет, чтобы это был «Отдых». Похоже, проблема спецификации!
  • 0
    нет вход UTF-16 - это Rest который при преобразовании в UTF-8 дает результат, который я показал
Показать ещё 4 комментария
0

Я подозреваю, что у вас есть проблема с энзином: попробуйте изменить это

changeCharEncoding("UCS-2","ISO8859-1",str,out,sizeof(out));

к этому

changeCharEncoding("UCS-2BE","ISO8859-1",str,out,sizeof(out));
0

Вообще говоря, вы не можете преобразовать произвольные 16-битные данные в 8-битные данные, вы потеряете некоторые данные

если вы пытаетесь преобразовать кодировки - применяется одно и то же правило, так как вы не можете преобразовать некоторые символы в 8-битный ASCII, чтобы они были потеряны, для разных платформ вы можете использовать разные функции:

Windows: WideCharToMultiByte

* nix: iconv

  • 0
    Я использовал iconv в приведенном выше коде, но он не работает так же. И я знаю, что некоторые данные будут потеряны, так что это не проблема
  • 0
    почему вы думаете, что это не работает? это ошибка памяти, неправильные результаты, пустые результаты?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню