У нас есть проект, в котором по историческим причинам обработка строк является какофонией кодировок и представлений; у нас определенно есть места, которые могут надежно обрабатывать только ASCII, в некоторых местах, вероятно, используется UTF-8, в некоторых местах на периферии, которые, как я подозреваю, используется 8-битное кодирование для конкретной платформы (разное, конечно, для разных целевых платформ), различные места, предназначенные для UCS-2, и, возможно, также те, которые были бы рады работать на UTF-16 - все они иногда передаются как строки в стиле C (char*
, CHAR16*
), а иногда как строки C ++ ( std::string
, std::basic_string<CHAR16>
). Конечно, с точки зрения документации очень мало.
В качестве первого шага к устранению этой путаницы я хочу настроить систему типов, использующую действительно разные типы для разных кодировок.
Одна мысль, которая пришла мне в голову, состояла в том, чтобы использовать, например. signed char
в качестве основы для строк ASCII и unsigned char
для строк UTF-8, а также char16_t
для UCS-2 и short
для UTF-16 (или что-то в этом духе), но это будет означать, что I не сможет напрямую использовать строковые литералы. Кроме того, возможность просто передавать строки ASCII функциям, ожидающим UTF-8 (но не наоборот), была бы изящной.
У вас есть какие-нибудь умные предложения о том, как это сделать, или, может быть, даже рабочий код?
Код должен быть совместим с C ++ 11.
Пожалуйста, воздержитесь от любых ответов в духе «просто постоянно используйте UTF-8», потому что это в любом случае моя конечная цель; скорее, речь идет о создании инструмента, который, как мне кажется, очень мне поможет.
- приложение -
Вероятно, я должен был упомянуть, что, как я полагаю, у нас уже есть проблемы, когда строковое кодирование не выстраивается должным образом, например Строки UTF-16 передаются в функции, которые могут обрабатывать только строки UCS-2, или 8-разрядные строки, специфичные для платформы, которые передаются функциям, которые ожидают строки ASCII. Буквально вчера я обнаружил выделенные функции преобразования, содержащие в своем названии "ASCII", которые фактически будут преобразовывать в / из Latin-1 вместо ASCII.