Какие более портативные и чистые
способы обработки символов Юникода
последовательности в C и C ++?
В вашей программе все строки должны быть UTF-8, UTF-16 или UTF-32 . Если по какой-либо причине вам необходимо работать с кодировкой, не относящейся к Юникоду, выполните преобразование на входе и выходе.
Чтение строк в Юникоде
Точно так же, как вы читаете файл ASCII. Но по-прежнему существует много данных, не относящихся к Юникоду, поэтому вам нужно проверить, являются ли данные Юникодом. Если это не так (или если это UTF-8, когда вы предпочитаете внутреннюю кодировку UTF-32), вам нужно конвертировать его.
- UTF-8 и UTF-32 могут быть надежно обнаружены путем проверки.
- UTF-16 можно обнаружить по наличию спецификации.
- Если это не кодировка UTF, скорее всего, в ISO-8859-1 или windows-1252.
Преобразование строк в кодировке Юникод в ASCII в
сохранить несколько байтов (если пользователь только
входы ASCII)
Не. Если ваши данные все ASCII, то UTF-8 займет столько же места. И если это не так, вы потеряете информацию при конвертации в ASCII. Если вы заботитесь о сохранении байтов.
- Выберите оптимальную кодировку UTF. Для символов от U + 0000 до U + 007F UTF-8 является наименьшим. Для символов от U + 0800 до U + FFFF UTF-16 является наименьшим.
- Использовать сжатие данных, например, gzip. Существует кодировка SCSU, специально разработанная для Unicode, но я не знаю, насколько она хороша.
Печать строк Unicode
Написание UTF-8 ничем не отличается от написания ASCII.
За исключением командной строки Windows, поскольку она по-прежнему использует старые кодовые страницы "OEM". Там вы можете использовать WriteConsoleW со строками UTF-16.
Должен ли я использовать среду тоже?
Я читал о LC_CTYPE, например,
я должен заботиться об этом как разработчик
LC_CTYPE
является пережитком тех дней, когда каждый язык имел свою собственную кодировку символов и, следовательно, свои собственные функции ctype.h
. Сегодня об этом заботится База данных символов Unicode . Прелесть Unicode в том, что он отделяет обработку кодировки символов от обработки локали (за исключением специальных правил в верхнем / нижнем регистре для литовского, турецкого и азербайджанского языков).
Но у каждого языка по-прежнему есть свои правила сортировки и правила форматирования чисел, так что вам все равно понадобятся локали для них. И вам нужно будет установить кодировку символов вашей локали в UTF-8.