2013-12-02 4 views
1

Я программирую какое-то устройство. Мне нужно сообщить кодировку производителю устройства, чтобы он мог создавать шрифт для устройства. Моя проблема: я думаю, я должен выбрать кодировку UTF8 или UTF16?Выбор кодирования и обработки строк

Я проверил и большинство букв моего алфавита в UTF-8 - 3 байта.

Я спрашиваю это, потому что это проще для работы с UTF8 или UTF16? (как я уже сказал, я программирую на каком-то устройстве, поэтому я hesitant немного для установки таких библиотек, как ICU, и т. Д.).

Какой должен выбрать UTF8 или UTF16?

Если я возьму UTF16 - мне нужно будет использовать wchar_t и соответствующие функции во всем праве?

Операции, которые могут потребоваться в строке: получить длину строки и, возможно, скопировать строки. Возможно также разбор (до моего разбора некоторые данные из моей строки, которая была написана в такой форме: «param1; param2; Param3;»)

+0

Оба являются Unicode. [Читайте это] (http://www.joelonsoftware.com/articles/Unicode.html) – user694733

+0

@ user694733: Привет, я прочитал это, но это не то, что я спросил. Я спросил, с кем из них легче работать (учитывая, что я не решаюсь устанавливать библиотеки, такие как ICU на устройстве). Если я использую UTF16 - значит ли это, что мне нужно использовать 'wchar_t' и соответствующие функции во всем мире? посмотрите на вопрос о том, что я спросил. –

+0

Да, если вы хотите самостоятельно разобрать файл Unicode. – Abhineet

ответ

2

wchar_t не обязательно означает, что UTF-16. В Linux и Unix (в компиляторе gcc и clang) wchar_t имеет длину 4 байта, что подходит для UTF-32.

Размер wchar_t зависит от компилятора.

Хранилище данных Unicode не должно основываться на wchar. В C++ 11 существуют такие типы, как char16_t и char32_t.

Что касается вашего вопроса, который должен быть использован:

Вы можете выполнить все эти операции, как на UTF-16 и UTF-8.

Если пространство имеет значение для выбранных вами символов, а UTF-16 обеспечивает оптимальное пространство, используйте UTF-16.

Однако сравнение строк немного сложно в UTF-16 из-за участия BMP. Это проблематично только в том случае, если у него будут символы за пределами U+10000.

UTF-8 проще для сравнения строк, но не для подсчета количества фактических символов Юникода или кодовых точек из-за переменного количества байтов для кодовой точки.

Операция копирования одинаково проста в обоих случаях.

Для разбора я считаю, что разделители будут символами ASCII. В этом случае, все будет легко. Если это не ASCII, UTF-8 может быть немного трудным для решения. В этом случае UTF-16 будет иметь проблему, когда есть BMP.

Спасибо пользователю694733 за это.

Представление UTF-8 такое же как для мало-endian, так и для big-endian, но не UTF-16. Здесь порядок байтов определяется BOM (знак порядка байтов).

Если вы не планируете использовать C++ 11 или C11 для char16_t, вы можете сохранить свою строку в массиве из short (если это 16-разрядный бит). Но вы можете написать много функций, таких как длина строки и копия строки самостоятельно (что, я думаю, легко писать, кроме printf и scanf).

Еще одна проблема, вы сталкиваетесь в этом подходе является то, что вы не будете в состоянии объявить литералов как

short word[] = "ABC"; 

, которые вы можете получить в C++ 11.

+0

Привет Кодовые точки для моего алфавита в форме U + xxxx - так что я думаю, что нет проблем с BMP ?? Они меньше, чем U + 10000? действительно, я проверил сейчас, и sizeof (wchar_t) на этом устройстве - 4. Кроме того, я не планирую использовать C++ 11 –

+1

+1 Но вы можете также упомянуть о возможных проблемах с контентом при загрузке файлов UTF-16. – user694733

+0

@dbasic: и я планирую использовать 'wchar_t' и соответствующие функции (например,' wcslen'), если я буду использовать UTF16/UCS-2. Это то, что я должен делать правильно? У вас что-то против 'wchar_t'? –

Смежные вопросы