MSVC UTF8 строковое кодирование использует неверные кодовые точки - PullRequest
1 голос
/ 27 октября 2019

Я пытаюсь записать символ "Ā" (https://www.fileformat.info/info/unicode/char/0100/index.htm) в строку C ++ 11 UTF8 (с использованием префикса u8).

const char *const utf8 = u8"Ā";
const char *const utf8_2 = u8"\u0100";
const char *const chars = "Ā";

const int utf8_len = strlen(utf8);
const int utf8_2_len = strlen(utf8_2);
const int chars_len = strlen(chars);

Запуск под MSVC(16.2.4) приводит к:

utf8_len == 5
utf8_2_len = 2;
chars_len = 2;

Где:

utf8 == "Ä€"
utf8_2 == "Ä€"
chars == "Ä€"

Исходный файл установлен в UTF8 (без спецификации).

Попытка сделать то же самое сClang и GCC работают, как и ожидалось:

https://godbolt.org/z/PNZFCa

Кто-нибудь знает, почему происходит такое поведение? Почему префиксный код Unicode u8 кодируется как 5 байтов (когда это должно быть2)?

1 Ответ

2 голосов
/ 28 октября 2019

Компилятор Microsoft предполагает локальную кодировку ANSI для файлов без спецификации, которая, вероятно, является Windows-1252 в вашем случае. Если вы запустите cl /? из командной строки, вы увидите следующие параметры командной строки:

...
/source-charset:<iana-name>|.nnnn set source character set
/execution-charset:<iana-name>|.nnnn set execution character set
/utf-8 set source and execution character set to UTF-8
...

Используйте /source-charset:UTF-8 или /utf-8, если вы не хотите сохранять с помощью спецификации.

Код теста, сохраненный в UTF-8 без спецификации:

#include <stdio.h>
#include <string.h>

int main()
{
    const char *const utf8 = u8"Ā";
    printf("%zu\n",strlen(utf8));
}

Выход:

C:\>cl /nologo test.cpp
test.cpp

C:\>test
5

C:\>cl /nologo /utf-8 test.cpp
test.cpp

C:\>test
2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...