Правильное использование хранения строк в C и C++

Популярные разработчики программного обеспечения и компании (Джоэл Спольски, Программное обеспечение 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не дает правильных результатов.

10
задан user1254893 18 March 2012 в 13:16
поделиться