Ни один из ответов, указывающих преимущество UTF-16 над UTF-8, не имеет никакого смысла, кроме ответа обратной совместимости.
Ну, есть два замечания для моего комментария.
Эрик заявляет: «UTF-16 покрывает весь BMP одиночными единицами - поэтому, если вам не нужны более редкие символы вне BMP, UTF-16 эффективно составляет 2 байта на символ».
Предостережение 1)
Если вы можете быть уверены, что вашему приложению НИКОГДА не понадобится какой-либо символ вне BMP, и что любой код библиотеки, который вы пишете для использования с ним, НИКОГДА не будет использоваться с любым приложением, которое когда-либо будет нуждаться в символе вне BMP, тогда Вы можете использовать UTF-16 и написать код, который подразумевает, что каждый символ будет иметь длину ровно два байта.
Это кажется чрезвычайно опасным (на самом деле, глупо).
Если ваш код предполагает, что все символы UTF-16 имеют длину в два байта, и ваша программа взаимодействует с приложением или библиотекой, где за пределами BMP находится один символ, то ваш код будет поврежден. Код, который проверяет UTF-16 или манипулирует им, должен быть написан для обработки случая символа UTF-16, требующего более 2 байтов; поэтому я «отклоняю» это предостережение.
UTF-16 не проще для кодирования, чем UTF-8 (код для обоих должен обрабатывать символы переменной длины).
Предостережение 2)
UTF-16 МОЖЕТ быть более вычислительно эффективным при некоторых обстоятельствах, если написано соответствующим образом.
Примерно так: Предположим, что определенные длинные строки редко модифицируются, но часто проверяются (или, что лучше, никогда не изменяются после сборки - т.е. строитель строк создает неизменяемые строки). Для каждой строки может быть установлен флаг, указывающий, содержит ли строка только символы «фиксированной длины» (т. Е. Не содержит символов, длина которых не равна точно двум байтам). Строки, для которых установлен флаг true, могут быть проверены с помощью оптимизированного кода, который принимает символы фиксированной длины (2 байта).
Как насчет космической эффективности?
UTF-16, очевидно, более эффективен для символов A), для которых для кодирования UTF-16 требуется меньше байтов, чем для UTF-8.
UTF-8, очевидно, более эффективен для символов B), для которых UTF-8 требуется меньше байтов для кодирования, чем UTF-16.
За исключением очень "специализированного" текста, вполне вероятно, что число (B) намного превышает количество (A).