Популярные разработчики программного обеспечения и компании (Джоэл Спольски, Программное обеспечение 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 €занимает 3 байта. Поэтому нужно сравнить три байта массива символов, чтобы узнать, совпадают ли символы Unicode. Часто вам нужно знать размер символа или строки, которые вы хотите сравнить, и биты, которые они производят, чтобы решение работало. Это совсем не похоже на хороший способ обработки Unicode.Есть ли лучший способ сравнения строк и символьных элементов типа char?
Кроме того, при использовании wchar_tкак можно отсканировать содержимое файла в массив? Функция freadне дает правильных результатов.