В вашем вопросе есть несколько недоразумений, поэтому я начну с ответа, который вы, вероятно, ищете, и перейду оттуда:
Вы должны кодировать в UTF-8, если у вас нет очень веская причина не кодировать в UTF-8. Есть несколько веских причин, но ни одна из них не связана с тем, какие языки поддерживаются.
UTF-8 и UTF-16 - это просто разные способы кодирования Unicode. Вы также можете кодировать Unicode в UTF-32. Вы можете даже кодировать Unicode в GB18030 или в одной из нескольких других кодировок. Пока кодировка может обрабатывать все кодовые точки Unicode, она будет охватывать одинаковое количество языков, глифов, сценариев, символов и т. Д. c. (Точное определение того, что подразумевается под кодовой точкой Unicode, само по себе является тонкой топикой c, в которую я не хочу вдаваться, но для этих целей давайте подумаем, что это «символ».)
Как правило, вы должны использовать UTF-8, потому что он чрезвычайно эффективен, если вы работаете с латинскими скриптами, и это наиболее часто поддерживаемая кодировка в этой экосистеме. Тем не менее, для некоторых проблем UTF-16 или UTF-32 могут быть более эффективными. Но без конкретной c причины вы должны использовать UTF-8.
Типы данных char*
и std::string
не представляют UTF-8. Они представляют собой последовательность char
. Это все, что они представляют. Эта последовательность char
может интерпретироваться многими способами. Весьма распространено интерпретировать его как UTF-8, но я бы даже не сказал, что это наиболее распространенная интерпретация (многие системы рассматривают его как расширенный ASCII, поэтому текст не на английском языке sh часто искажается при перемещении между систем).
Если вы хотите работать в UTF-8, вам часто приходится делать больше, чем использовать std:string
. Вам нужна библиотека обработки UTF-8, чаще всего std::locale
для простого использования или ICU для более сложных проблем. Символы UTF-8 могут иметь длину от 1 до 4 char
, поэтому вы должны быть очень внимательны при применении обработки символов. Наиболее распространенной ошибкой является то, что UTF-8 не поддерживает произвольный доступ. Вы не можете просто перейти к 32-й букве в строке. Вы должны обработать его с самого начала, чтобы найти все разрывы персонажа. Если вы начнете обрабатывать строку UTF-8 в произвольной точке, вы можете перейти в середину символа.
Посредством объединения символов кодировки UTF-8 могут стать (во многих системах) произвольно длинными. Визуально один «символ» ???? кодируется как последовательность из 25 char
значений в UTF-8. (Конечно, в UTF-16 он кодируется как 12 wchar_t
значений. Никакое кодирование Unicode не избавляет вас от необходимости думать о комбинировании символов.)
С другой стороны, UTF-8 настолько мощен, что вы можете часто игнорируют это для определенных проблем. Символ A
кодируется в UTF-8 точно так же, как в ASCII (65), и UTF-8 обещает, что в последовательности не будет байтов, которые равны 65 и не являются A
. Таким образом, поиск указанных c ASCII-последовательностей не требует специальной обработки (как в UTF-16).
Как NathanOliver указывает , использование любой кодировки Unicode будет поддерживать только языки , глифы, сценарии, символы и т. д. c. который поддерживает Unicode. На практике это подавляющее большинство широко используемых языков в мире. Это не каждый язык (и у него есть недостатки в том, как он обрабатывает некоторые языки, которые он поддерживает), но это, безусловно, самая всеобъемлющая система, которую мы имеем сегодня.