Совместимость двухбайтных символьных типов в бинарном представлении

Есть интерфейс на C++ для т.н. внешней компоненты для 1С (Native API), в нём используются строковые литералы вида L"string". Так как размер типа wchar_t зависит от платформы (Linux - 4 байта, Windows - 2 байта), то там же используется функция преобразования, а также макрос:

#ifdef _WINDOWS
#define WCHAR_T     wchar_t
#else
#define WCHAR_T     uint16_t
#endif

У функций, которые используются для взаимодействия с 1С стандартный интерфейс. Все они должны передавать и принимать WCHAR_T*, т.е. wchar_t* для Windows и uint16_t* для Linux. Т.к. uint16_t всего лишь целочисленный тип, то очевидно, что проблем с ним быть не может.

Я задумался над тем, чтобы просто заменить L"string" на u"string" и избавиться от лишних преобразовний. Но не вполне ясно, насколько бинарно совместимы типы wchar_t и char16_t?

Вроде как 1С использует UTF-16, и тип char16_t был создан для него же... Могут ли быть с этим проблемы, пускай даже не конкретно в этом случае, а вообще, между заменой старого wchar_t на более новый char16_t?


Ответы (1 шт):

Автор решения: megorit

Вот такой код возвращает true:

const wchar_t* wchar_str  = L"йцукенгшщзхъфывапролджэячсмитьбю"
                            L"ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ"
                            L"测试中文双字节表示的文本以检查编码"
                            L"テスト用日本語テキスト"
                            L"ტესტი ტექსტი იაპონური ტესტირება";
const char16_t* utf16_str = u"йцукенгшщзхъфывапролджэячсмитьбю"
                            u"ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ"
                            u"测试中文双字节表示的文本以检查编码"
                            u"テスト用日本語テキスト"
                            u"ტესტი ტექსტი იაპონური ტესტირება";

bool is_equal = true;
while (*wchar_str != L'\0' && *utf16_str != u'\0')
    if (*wchar_str++ != *utf16_str++)
        is_equal = false;

std::clog << "wchar_t and char16_t is equal: "
          << std::boolalpha
          << is_equal
          << std::endl;

Других двухбайтовых кодировок, кроме UTF-16, я не нашёл. Видимо, это всегда должно работать корректно.

→ Ссылка