Аргументы за и против поддержки std :: wstring исключительно в кроссплатформенной библиотеке - PullRequest
6 голосов
/ 06 сентября 2010

В настоящее время я занимаюсь разработкой кроссплатформенной библиотеки C ++, которую я намерен поддерживать Unicode. В настоящее время у меня есть поддержка времени компиляции для std :: string или std :: wstring через typedefs и макросы. Недостаток этого подхода заключается в том, что он заставляет вас использовать макросы типа L("string") и интенсивно использовать шаблоны, основанные на типе символов.

Каковы аргументы за и против поддержки только std :: wstring?

Будет ли использование std :: wstring исключительно мешать пользовательской базе GNU / Linux, где предпочтительна кодировка UTF-8?

Ответы [ 5 ]

3 голосов
/ 06 сентября 2010

Многие люди хотели бы использовать юникод с UTF-8 (std :: string), а не с UCS-2 (std :: wstring).UTF-8 - это стандартная кодировка во многих дистрибутивах и базах данных Linux, поэтому ее поддержка будет огромным недостатком.В Linux каждый вызов функции в вашей библиотеке со строкой в ​​качестве аргумента потребует от пользователя преобразования (нативной) строки UTF-8 в std :: wstring.

В gcc / linux каждый символ std:: wstring будет иметь 4 байта, а в Windows - 2 байта.Это может привести к странным эффектам при чтении или записи файлов (и копировании их с / на разные платформы).Я бы рекомендовал UTF-8 / std :: string для кроссплатформенного проекта.

2 голосов
/ 06 сентября 2010

Я бы сказал, что использование std::string или std::wstring не имеет значения.

Никто не предлагает надлежащую поддержку Юникода в любом случае.

Если вам нужна интернационализация, вам нужна надлежащая поддержка Unicode, и вам следует начать изучение таких библиотек, как ICU.

После этого все зависит от того, какое кодирование используется, и это зависит от платформы, на которой вы находитесь: оберните зависящие от ОС средства за уровнем абстракции и, при необходимости, преобразуйте в уровень реализации.

Не беспокойтесь о кодировке, используемой внутри библиотеки Unicode, которую вы используете (или build? Hum), это вопрос производительности и не должен влиять на использование самой библиотеки.

2 голосов
/ 06 сентября 2010

Для:

Против:

  • Возможно, вам придется взаимодействовать с кодом, который не поддерживает i18n.Но, как и любой хороший автор библиотек, вы просто спрячете этот беспорядок за простым в использовании интерфейсом, верно?Правильно?
2 голосов
/ 06 сентября 2010

Каковы аргументы за и против поддержки только std :: wstring?

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

Аргумент против этого, который я знаю:

  • широким символам нужно больше места (что вряд ли актуально, у китайцев, в принципе, больше нет головной боли над памятью, чем у американцев).have)
  • использование широких символов вызывает головную боль у некоторых западных людей, которые используются для того, чтобы все их символы вписывались в 7bit (и не хотят учиться уделять немного внимания тому, чтобы не смешивать использование типа символа для фактическогосимволы и другие варианты использования)

Что касается гибкости: я сохранил библиотеку (несколько килограмм), которая могла бы работать как с узкими, так и с широкими символами.Большая часть этого была через тип символа, являющийся параметром шаблона, я не помню никаких макросов (кроме UNICODE, то есть).Не все это было гибким, однако, там был некоторый код, который в конечном счете требовал либо строку char, либо wchar_t.(Нет смысла делать широкие строки внутренних ключей широкими символами.)
Пользователи могут решать, хотят ли они только поддержку узких символов (в этом случае "string" хорошо) или поддержку только широких символов (что требует от них использования * 1020).*) или они тоже хотели поддерживать оба (что требовало что-то вроде T("string")).

0 голосов
/ 06 сентября 2010

Недостаток:

Поскольку wstring действительно UCS-2, а не UTF-16.Я ударю тебя в голени один день.И это сильно ударит.

...