Печать на терминал в нейтральной кодировке - PullRequest
1 голос
/ 30 ноября 2011

Я хотел бы вывести строку на экран независимо от ее кодировки (UTF-8,16,32).Эта строка представлена ​​в массиве char, поэтому мне нужно игнорировать нулевые байты и продолжить печать в stdout;это исключает вопрос о семье и друзьях printf.

char text[] = { 0x00, 0x55, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65 };

fwrite( text, sizeof(char), sizeof(text), stdout );

С этой целью я выбрал вышеуказанное решение, чтобы дать мне возможность печатать все форматы кодировки UTF.Я понимаю, что некоторые терминалы не будут правильно отображать символы, но это не моя проблема, так как это настраиваемый параметр вне приложения.

В моем приложении есть настройки для загрузки каталога сообщений (en_EN.UTF-8,и т. д.) однако я хочу избежать необходимости выполнять преобразование строк в коде, основанном на выбранной в данный момент локали.

Могу ли я получить отзыв об этом подходе, прежде чем я позволю ему начать работу?

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Вы не можете этого сделать. Когда вы имеете дело с текстом, кодирование имеет большое значение. Так что вы должны сделать преобразование.

И также плохо хранить вещи в массиве char, вы должны использовать байтовый массив. Потому что:

  • Если это еще не определено в каком-либо заголовке, вы должны определить (или typedef) байт как беззнаковый символ. Обычный символ может быть подписан или не подписан, и у вас будут сюрпризы.
  • Более читабельно, так как оно проясняет намерение. Я вижу байт, это куча байтов. Я вижу char, это обычный текст (и в вашем случае это явно не так)
0 голосов
/ 01 декабря 2011

Что если вы определили массив символов в режиме Big-Endian и терминал принимает Little-Endian?Или наоборот ?Я тоже думаю, что вы не можете жить без обращения, когда имеете дело с char -> Utf (только из-за байтов).Также разумно сделать определение некоторых

typedef unsigned char  utf8char;
typedef unsigned short utf16char;
typedef unsigned int   utf32char;

и

typedef enum {
   BIG_ENDIAN,
   LITTLE_ENDIAN
} CHAR_ENDIANNESS

Таким образом, вы сделаете преобразование в UTF более прозрачным, отладка будет проще, а обслуживание кода улучшится.1010 *

...