В чем разница между UTF и UCS.
Кодировки UCS имеют фиксированную ширину и отмечены количеством байтов, используемых для каждого символа. Например, UCS-2 требует 2 байта на символ. Символы с кодовыми точками за пределами доступного диапазона не могут быть закодированы в кодировке UCS.
Кодировки UTF имеют переменную ширину и отмечены минимальным количеством битов для хранения символа. Например, UTF-16 требует по меньшей мере 16 бит (2 байта) на символ. Символы с большими кодовыми точками кодируются с использованием большего количества байтов - 4 байта для астральных символов в UTF-16.
- Внутреннее представление внутри кода
- Наилучшее представление хранилища (т.е. в файле)
- Лучший формат для проводного транспорта (передача между приложениями, которые могут
быть на разных архитектурах и иметь
другой стандартный язык)
Для современных систем наиболее приемлемым кодированием хранения и транспорта является UTF-8. Существуют особые случаи, когда могут подойти другие - UTF-7 для старых почтовых серверов, UTF-16 для плохо написанных текстовых редакторов - но UTF-8 является наиболее распространенным.
Предпочтительное внутреннее представление будет зависеть от вашей платформы. В Windows это UTF-16. В UNIX это UCS-4. У каждого есть свои плюсы:
- Строки UTF-16 никогда не используют больше памяти, чем строка UCS-4. Если вы храните много больших строк с символами в основном в базовой многоязычной плоскости (BMP), UTF-16 потребует гораздо меньше места, чем UCS-4. За пределами BMP он будет использовать ту же сумму.
- UCS-4 легче рассуждать. Поскольку символы UTF-16 могут быть разделены на несколько «суррогатных пар», может возникнуть проблема с правильным разделением или отображением строки. Текст UCS-4 не имеет этой проблемы. UCS-4 также действует подобно тексту ASCII в массивах "char", поэтому существующие текстовые алгоритмы могут быть легко перенесены.
Наконец, некоторые системы используют UTF-8 в качестве внутреннего формата. Это хорошо, если вам нужно взаимодействовать с существующими системами на основе ASCII или ISO-8859, поскольку байты NULL отсутствуют в середине текста UTF-8 - они есть в UTF-16 или UCS-4.