Достаточно ли UTF-8, который представлен в char * & std :: string, для поддержки всех языков? - PullRequest
1 голос
/ 11 марта 2020

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

Итак, я хочу знать, достаточно ли "UTF-8", который представлен в типах данных char* & std::string, чтобы поддерживать все языки для чтения и записи, или я должен использовать "UTF-16", который представлены в типах данных wchar_t* & std::wstring?

Короче говоря, какой тип данных должен использоваться и подходит для этой задачи, будь то эти типы данных или другие?

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

В вашем вопросе есть несколько недоразумений, поэтому я начну с ответа, который вы, вероятно, ищете, и перейду оттуда:

Вы должны кодировать в 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. На практике это подавляющее большинство широко используемых языков в мире. Это не каждый язык (и у него есть недостатки в том, как он обрабатывает некоторые языки, которые он поддерживает), но это, безусловно, самая всеобъемлющая система, которую мы имеем сегодня.

0 голосов
/ 11 марта 2020

Нет, UTF-8 недостаточно для поддержки всех языков (пока). Из пока не поддерживаемых скриптов

  • Лома
  • Наси Донгба (Мосо)

в настоящее время не поддерживается.

...