Совместимость двухбайтных символьных типов в бинарном представлении
Есть интерфейс на 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 шт):
Вот такой код возвращает 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, я не нашёл. Видимо, это всегда должно работать корректно.