Популярные разработчики программного обеспечения и компании (Joel Spolsky, Программное обеспечение Fog Creek) имеют тенденцию использовать wchar_t для хранения символов Unicode при написании кода 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");
Как вы можете сравнивать байты Unicode (или символы) при использовании char?
До сих пор мой предпочтительный способ сравнения строк и символов типа char в C часто выглядит так:
/* C code fragment */
const char *mail[] = { "ov€[email protected]", "ov€[email protected]" };
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 байта. Поэтому нужно сравнить три байта массива char, чтобы узнать, соответствуют ли символы Unicode. Часто вам нужно знать размер символа или строки, которую вы хотите сравнить, и биты, которые она создает для решения. Это не похоже на хороший способ обработки Unicode. Есть ли лучший способ сравнения строк и символьных элементов типа char?
Кроме того, при использовании wchar_t, как вы можете сканировать содержимое файла в массив? Функция fread не дает достоверных результатов.