Я предполагаю, что ваш проект не связан с обработкой, обработкой или преобразованием текста: для обработки текста гораздо проще выбрать одну и только одну кодировку, одинаковую для всех платформ, а затем выполнить преобразование, если необходимо при использованииродной API.
Но если ваш проект не сконцентрирован на обработке / манипулировании / преобразовании текста, то ограничение на UTF-8 на всех платформах не самое простое решение.
Избегайте использования char
в Windows
Если вы работаете с типом char
при разработке Windows, тогда все WinAPI будут использовать char
.
Проблема в том, что тип char
в Windowsиспользуется для «исторических» приложений, то есть до-Unicode-приложений.
Каждый текст char
интерпретируется как текст не-Unicode, кодировка / кодировка которого выбирается пользователем Windows, а не пользователем.developper .
Значение: если вы считаете, что работаете с UTF-8, отправьте этот текст UTF-8 char
в WinAPI для вывода в GUI (иTextBox и т. Д.), А затем выполните свой код в Windows, настроенной на арабском языке (например), и вы увидите, что ваш красивый символ UTF-8 не будет корректно обрабатываться WinAPI, потому что WinAPI в этой Windowsсчитает, что все char
должны интерпретироваться как кодировка Windows-1256 .
Если вы работаете с char
в Windows, вы отказываетесь от Unicode если каждый вызов WinAPI не проходит через перевод (обычно через Framework, такой как GTK +, QT и т. д., но это могут быть ваши собственные функции-оболочки).
Оптимизация - это кореньвсего зла, но тогда преобразование всех ваших текстов UTF-8 из и в UTF-16 каждый раз, когда вы обсуждаете с Windows, кажется мне совершенно бесполезной пессимизацией.
Альтернатива: почему бы не использовать TCHAR навсе платформы?
Что вам нужно сделать, так это работать с TCHAR
, предоставить заголовок, аналогичный tchar.h
для Linux / MacOS / независимо от того, что (повторное выделение макросов и т. д. в исходном заголовке tchar.h
),увеличивая этос tchar.h
-подобным заголовком для объектов стандартной библиотеки, которые вы хотите использовать.Например, мой tstring.hpp
выглядит так:
// tstring.hpp
#include <string>
#include <sstream>
#include <fstream>
#include <iostream>
#ifdef _MSC_VER
#include <tchar.h>
#include <windows.h>
#else
#ifdef __GNUC__
#include <MyProject/tchar_linux.h>
#endif // __GNUC__
#endif
namespace std
{
#ifdef _MSC_VER
// On Windows, the exact type of TCHAR depends on the UNICODE and
// _UNICODE macros. So the following is useful to complete the
// tchar.h headers with the C++ Standard Library's symbols.
#ifdef UNICODE
typedef wstring tstring ;
// etc.
static wostream & tcout = wcout ;
#else // #ifdef UNICODE
typedef string tstring ;
// etc.
static ostream & tcout = cout ;
#endif // #ifdef UNICODE
#else // #ifdef _MSC_VER
#ifdef __GNUC__
// On Linux, char is expected to be UTF-8 encoded, so the
// following simply maps the txxxxx type into the xxxxx
// type, forwaking the wxxxxx altogether.
// Of course, your mileage will vary, but the basic idea is
// there.
typedef string tstring ;
// etc.
static ostream & tcout = cout ;
#endif // __GNUC__
#endif // #ifdef _MSC_VER
} // namespace std
Отказ от ответственности: Я знаю, что объявлять вещи в std
- зло, но у меня были другие дела, кроме педантизма в этомконкретный предмет.
Используя эти заголовки, вы можете использовать Стандартную библиотеку C ++ в сочетании со средством TCHAR
, то есть использовать std::tstring
, который будет скомпилирован как std::wstring
в Windows (при условии, что вы компилируете определения UNICODE
и _UNICODE
определений) и как std::string
на других ОС на основе char
, которые вы хотите поддерживать.
Таким образом, вы сможетеиспользуйте родной символьный тип платформы бесплатно.
Пока вы агностик с вашим типом символов TCHAR
, проблем не будет.
И дляесли вы действительно хотите разобраться с грязной стороной UTF-8 по сравнению с UTF-16, тогда вам нужно предоставить код для преобразования (при необходимости) и т. д.
Обычно это делается путем предоставленияперегрузки одной и той же функции для разных типов и для каждой ОС.Таким образом, правильная функция выбирается во время компиляции.