Могу ли я использовать для этого std::string
или мне следует использовать std::wstring
?
Оба могут использоваться. Если вы используете std::string
, кодировка должна быть UTF-8, чтобы избежать нулевых байтов, которые вы получили бы, если бы использовали UTF-16, UCS-2 и т. Д. Если вы используете std::wstring
, вы также можете использовать кодировки, требующие большие числа для представления отдельных символов, то есть UCS-2 и UCS-4, как правило, подходят, но, строго говоря, это зависит от реализации. В C ++ 11 также есть std::u16string
(подходит для UTF-16 и UCS-2) и std::u32string
(подходит для UCS-4).
Итак, какой из этих типов использовать, зависит от того, какую кодировку вы предпочитаете, а не от количества или типа языков, которые вы хотите представлять.
Как показывает опыт, UTF-8 отлично подходит для хранения больших текстов, тогда как UCS-4 лучше всего, если объем памяти не имеет большого значения, но вы хотите, чтобы итерации на уровне символов и арифметика положения были удобными и быстрыми. (Пример: пропуск n
символов в строке UTF-8 - это операция O (n), тогда как в UCS-4 это операция O (1).)
Если я хочу токенизировать каждое из слов в строке и поместить их в char *, следует ли мне использовать wchar? Но некоторые кодировки, такие как UTF, могут быть больше, чем поддерживает wchar.
Я бы использовал для слов тот же тип данных, что и для самого текста. Т.е. слова из std::string
текста также должны быть std::string
, а слова из std::wstring
должны быть std::wstring
.
(Если действительно есть веская причина для перехода от строкового типа данных к типу данных символьного указателя, конечно, char*
подходит для std::string
, а wchar_t*
подходит для std::string
. Аналогично для типов C ++ 11 есть char16_t*
и char32_t*
.)
В целом, каков «общепринятый» подход к этому типу дел?
Первый вопрос, который вам нужно ответить самому себе, - какую кодировку вы хотите использовать для хранения и обработки. В международных условиях только кодировки Unicode действительно подходят, но есть еще больше, чем одна на выбор: UTF-8, UCS-2 и UCS-4 являются наиболее распространенными. Как описано выше, то, какой из них вы выберете, повлияет на объем памяти и скорость обработки, поэтому тщательно подумайте, какие типы операций вам необходимо выполнить. Может потребоваться преобразование из одной кодировки в другую в определенных точках вашей программы для оптимального пространственно-временного поведения. Как только вы узнаете, какую кодировку вы хотите использовать в каждой части программы, выберите соответствующий тип данных.
После выбора кодировки и типов данных вам также может потребоваться нормализация Unicode. Во многих языках один и тот же символ (или комбинация символов / диакритических знаков) может быть представлен более чем одной последовательностью кодовых точек Unicode (особенно при использовании комбинирования символов). Чтобы правильно справиться с этими случаями, вам может потребоваться применить нормализацию Unicode (например, NFKC) к строкам. Обратите внимание, что в стандартной библиотеке C ++ для этого нет встроенной поддержки.
person
jogojapan
schedule
02.12.2013