wchar_t в октеты - в C? - PullRequest
       3

wchar_t в октеты - в C?

0 голосов
/ 25 июля 2010

Я пытаюсь сохранить строку wchar_t как октеты, но я уверен, что делаю это неправильно - кто-нибудь возражает против проверки моей попытки?Что произойдет, если один символ будет использовать 4 байта?

  unsigned int i;
  const wchar_t *wchar1 = L"abc";
  wprintf(L"%ls\r\n", wchar1);

  for (i=0;i< wcslen(wchar1);i++) {
    printf("(%d)", (wchar1[i]) & 255);
    printf("(%d)", (wchar1[i] >> 8) & 255);
  }

Ответы [ 4 ]

4 голосов
/ 25 июля 2010

Текст Unicode всегда кодируется.Популярные кодировки UTF-8, UTF-16 и UTF-32.Только последний имеет фиксированный размер для глифа.UTF-16 использует суррогаты для кодовых точек в верхних плоскостях, такой глиф использует 2 wchar_t.UTF-8 ориентирован на байты, он использует от 1 до 4 байтов для кодирования кодовой точки.

UTF-8 является отличным выбором, если вам необходимо перекодировать текст в байтовый поток.Очень распространенный выбор для текстовых файлов и кодировки HTML в Интернете.Если вы используете Windows, то вы можете использовать WideCharToMultiByte () с CodePage = CP_UTF8.Хорошей альтернативой является библиотека ICU.

Будьте осторожны, чтобы избежать кодирования байтов, которое переводит текст в кодовую страницу, такую ​​как wcstombs ().Это кодировки с потерями, глифы, которые не имеют соответствующего кода символа в кодовой странице, заменяются на?.

1 голос
/ 25 июля 2010

Вы можете использовать функцию wcstombs() (широкая строка в многобайтовую строку), предоставленную в stdlib.h

. Прототип выглядит следующим образом:

#include <stdlib.h>

size_t wcstombs(char *dest, const wchar_t *src, size_t n);

Он будет правильно преобразовывать ваши wchar_t строка, предоставленная src в строку char (он же октеты) и запись ее в dest с максимум n байтами.

char wide_string[] = "Hellöw, Wörld! :)";
char mb_string[512]; /* Might want to calculate a better, more realistic size! */
int i, length;

memset(mb_string, 0, 512);
length = wcstombs(mb_string, wide_string, 511);

/* mb_string will be zero terminated if it wasn't cancelled by reaching the limit
 * before being finished with converting. If the limit WAS reached, the string
 * will not be zero terminated and you must do it yourself - not happening here */

for (i = 0; i < length; i++)
   printf("Octet #%d: '%02x'\n", i, mb_string[i]);
0 голосов
/ 25 июля 2010

Я не знаю, почему printf и wprintf не работают вместе.Следующий код работает.

unsigned int i;
const wchar_t *wchar1 = L"abc";
wprintf(L"%ls\r\n", wchar1);

for(i=0; i<wcslen(wchar1); i++)
{   
    wprintf(L"(%d)", (wchar1[i]) & 255);
    wprintf(L"(%d)", (wchar1[i] >> 8) & 255);
}   
0 голосов
/ 25 июля 2010

Если вы пытаетесь увидеть содержимое буфера памяти, содержащего строку, вы можете сделать это:

  size_t len = wcslen(str) * sizeof(wchar_t);
  const char *ptr = (const char*)(str);
  for (i=0; i<len; i++) {
    printf("(%u)", ptr[i]);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...