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

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. Также предложите мне, если есть что-то еще, чтобы сделать то же самое.

0

Решение

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

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

Результирующий UTF-8 вывод должен быть

刀攀猀琀

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

1

Другие решения

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

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

Окна: WideCharToMultiByte

* Никс: Iconv

0

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

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

к этому

changeCharEncoding("UCS-2BE","ISO8859-1",str,out,sizeof(out));
0
По вопросам рекламы [email protected]