Внимательно посмотрите, что вы делаете в этой строке:
if(!testEncode("\u03A3", "\xE4")) {
Ссылается на строковый литерал:
"\u03a3"
Вы пытаетесь express ввести символ UTF-16 внутри 8-битный строковый литерал (char *). Это просто не сработает. Это своего рода эквивалент:
char sz[2] = {0};
sz[0] = (char)(0x03a3);
И ожидание, что sz[0]
будет содержать исходный символ UTF-16. Об этом и предупреждает компилятор.
Если вы хотите express 16-битный символ Юникода внутри строкового литерала, используйте широкую строку. Как показано ниже с префиксом L
:
L"\u03a3"
Это строковый литерал, который содержит символ с широким набором символов: L"Σ"
И если мы действительно хотим быть pendanti c, мы могли бы сказать это переносимой express символьной строке UTF-16, используйте префикс u
:
u"\u03a3"
Но на Windows wchar_t 16-битный, поэтому он не на самом деле не имеет значения.
Вероятно, вам нужно будет исправить ваши testEncode
функции, чтобы они ожидали const wchar_t*
вместо параметра const char*
. (Я, честно говоря, не уверен, что делают ваши test*
функции, но некоторые из ваших параметров выглядят подозрительно, если цель состоит в том, чтобы подтвердить преобразование UTF8 в UTF16)
Если вы хотите express UTF- 8 в коде можно сказать так:
"\xCE\xA3"
Выше приведено представление UTF-8 для символа сигмы Σ
в виде строки UTF-8