Популярные разработчики программного обеспечения и компании ( Джоэл Спольски, Программное обеспечение Fog Creek ), как правило, используют wchar_t для символа Unicode память при записи C или C ++ код. Когда и как следует использовать char и wchar_t в отношении хорошей практики кодирования?
Меня особенно интересует соответствие POSIX при написании программного обеспечения, использующего Unicode.
При использовании wchar_t вы можете искать символы в массиве широких символов для каждого символа или для каждого элемента массива:
/* C code fragment */
const wchar_t *overlord = L"ov€rlord";
if (overlord[2] == L'€')
wprintf(L"Character comparison on a per-character basis.\n");
Как можно сравнивать байты юникода (или символы) при использовании char ?
Пока мой предпочтительный способ сравнения строк и символов типа char в C часто выглядит так:
/* C code fragment */
const char *mail[] = { "ov€rlord@masters.lt", "ov€rlord@masters.lt" };
if (mail[0][2] == mail[1][2] && mail[0][3] == mail[1][3] && mail[0][3] == mail[1][3])
printf("%s\n%zu", *mail, strlen(*mail));
Этот метод выполняет поиск байтового эквивалента символа Юникода. Символ Unicode Euro € занимает 3 байта. Поэтому необходимо сравнить три байта массива символов, чтобы узнать, совпадают ли символы Юникода. Зачастую вам нужно знать размер символа или строки, которые вы хотите сравнить, и биты, которые он генерирует, чтобы решение работало. Это совсем не похоже на хороший способ обработки Unicode. Есть ли лучший способ сравнения строк и символьных элементов типа char ?
Кроме того, когда вы используете wchar_t , как вы можете сканировать содержимое файла в массив? Функция fread не дает правильных результатов.