Несоответствие в Unicode с wchar_t против ICU в C ++ - PullRequest
1 голос
/ 22 декабря 2010

Хотя wchar_t несовместимо в случае поддержки на разных компиляторах, но можно ли предположить, что реализация и размер wchar_t одинаковы в GNU / GCC по крайней мере в Linux?

Несмотря на то, что размер wchar_t зависит от архитектуры системы с точки зрения размера бита (32-бит / 64-бит), является ли Wide Character Type в Linux (GNU / GCC) фактически зависимым от компилятора или библиотек libstdc ++?Под изменением или обновлением я подразумеваю, что wchar_t может не работать должным образом с точки зрения размера и поддержки

Хотя IBM ICU - это еще один вариант, можно ли его использовать вв сочетании с std::string?

Должен ли я полностью отклонить wchar_t в пользу ICU?

Примечание: В Unix-подобных операционных системах, таких как Linux с GNU / GCClibstdc ++ обеспечивает базовую функциональность C ++ для компилятора, поэтому иногда обновляется.

Ответы [ 2 ]

3 голосов
/ 22 декабря 2010

Если вы хотите представить строки пользователю, вам, возможно, придется принять во внимание wchar_t (или некоторый другой определенный библиотекой тип). Различные компиляторы и платформы определяют wchar_t по-разному, потому что они используют разные методы кодирования Unicode. Например, в Windows / Visual C ++ wchar_t - это 16-битный тип, подходящий для UTF-16. Например, в GCC / Linux wchar_t - это 32-битный тип, подходящий для UTF-32.

В библиотеке IBM ICU есть функции преобразования для преобразования из одной кодировки в другую. Ваша платформа (например, Win32) может также иметь функции для преобразования из одной кодировки в другую.

В зависимости от ваших требований (скорость, использование памяти), вы должны выбрать внутренний формат, подходящий для платформы. В Windows это может быть UTF-16, а в Linux это может быть UTF-32. Таким образом, вам не придется все время перекодировать строки, просто выполнять над ними простые операции, определяемые платформой (wcslen(), wcscmp() и т. Д.).

Для внешних форматов (текстовых файлов и т. Д.) Я обычно использую UTF-8. Причина в том, что файлы значительно меньше, если они содержат текст на западном языке. Еще одним преимуществом является то, что вам не нужно учитывать бесконечность в UTF-8, что снижает вероятность ошибок (с вашей или какой-либо другой стороны).

IBM ICU - очень большая и компетентная библиотека для обработки строк Unicode. Хотя, это может быть использование кувалды, чтобы вбить маленький гвоздь. Вам нужен весь его функционал? Функциональность Unicode, поддерживаемая целевой платформой, может соответствовать вашим требованиям.

1 голос
/ 22 декабря 2010

В принципе, да, wchar_t может измениться с новой версией компилятора (хотя это языковая функция, а не библиотечная, поэтому она не зависит от библиотек).

На практике шансы внезапно меняющегося размера практически равны нулю.

Хотя не совсем понятно, что вам на самом деле нужно .wchar_t просто позволяет хранить широкие символы, и не намного.ICU - это полная библиотека Unicode, которая делает гораздо больше и очень важна, если вы хотите выполнять более сложную обработку текста, чем просто печатать строки.

Наконец, на * nix, простых char,или std::string обычно используют кодировку UTF-8, поэтому они идеально подходят для хранения текста Unicode.wchar_t редко используется по этой причине.

...