Ваш компилятор неправильно интерпретирует файл исходного кода (который сохраняется как UTF-8) как Windows-1252 (обычно называемый ANSI). Он не интерпретирует последовательность байтов C4 92
как односимвольную строку UTF-8 "Ē", а как двухсимвольную строку Windows-1252 "Ä’"
. Кодовая точка Unicode "Ä"
- это U + 00C4, а кодовая точка Unicode "’"
- U + 2019. Это именно то, что вы видите в вашей строке широких символов.
8-битная строка работает только потому, что неправильная интерпретация строки не имеет значения, так как она не преобразуется во время компиляции. Компилятор считывает строку как Windows-1252 и выдает строку как Windows-1252 (поэтому ему не нужно ничего преобразовывать, и считает, что оба являются «Ä»). Вы интерпретируете исходный код и данные в двоичном виде как UTF-8, поэтому вы считаете, что оба значения "Ē"
.
Чтобы компилятор обрабатывал ваш исходный код как UTF-8, используйте переключатель / utf-8 .
Кстати: правильная кодировка UTF-16 (которая является кодировкой, используемой MSVC для строк широких символов), наблюдаемая в строке широких символов, не {0xc492, 0x0000}
, но {0x0112, 0x0000}
, поскольку "Ē"
- это U+0112
.