Я пытаюсь реализовать текстовую поддержку в Windows с намерением позже перейти на платформу Linux. Было бы идеально поддерживать международные языки в унифицированном виде, но это, похоже, нелегко выполнить при рассмотрении обеих рассматриваемых платформ. Я потратил значительное количество времени на чтение UNICODE, UTF-8 (и других кодировок), широкоформатных и т.д., И вот что я понял до сих пор:
UNICODE, как стандарт, описывает набор символов, которые могут отображаться, и порядок, в котором они происходят. Я называю это "что": UNICODE указывает, что будет доступно.
UTF-8 (и другие кодировки) определяют, как: как каждый символ будет представлен в двоичном формате.
Теперь, в Windows, они первоначально выбрали кодировку UCS-2, но это не соответствовало требованиям, поэтому UTF-16 - это то, что у них есть, что также является multi- char при необходимости.
Итак, вот делемма:
- Windows внутри только UTF-16, поэтому, если вы хотите поддерживать международные символы, вам необходимо преобразовать их в свои широкоформатные версии, чтобы соответствующим образом использовать вызовы ОС. Кажется, что нет никакой поддержки для вызова чего-то типа CreateFileA() с многобайтовой строкой UTF-8, и она выглядит правильно. Правильно ли это?
- В C есть несколько многобайтовых поддерживающих функций (_mbscat, _mbscpy и т.д.), однако в окнах тип символа определяется как unsigned char * для этих функций. Учитывая тот факт, что ряд функций _mbs не является полным набором (т.е. Нет _mbstol для преобразования многобайтовой строки в длинную, например), вы вынуждены использовать некоторые версии char * среды выполнения функции, что приводит к проблемам с компилятором из-за разницы между подписанными/неподписанными типами этих функций. Кто-нибудь даже использует их? Вы просто делаете большую кучу кастингов, чтобы обойти ошибки?
- В С++ std::string имеет итераторы, но они основаны на char_type, а не на кодовых точках. Поэтому, если я делаю a ++ на std::string:: iterator, я получаю следующий символ char_type, а не следующий код. Аналогично, если вы вызываете std::string:: operator [], вы получаете ссылку на char_type, который имеет большой потенциал, чтобы не быть полной точкой кода. Итак, как один из них перебирает std::string по кодовой точке? (C имеет функцию _mbsinc()).