Работа с объектами UTF-8 std :: string в C ++ - PullRequest
1 голос
/ 31 января 2020

Я использую Visual Studio и C++ на Windows для работы с маленькими заглавными буквами, такими как ʜᴇʟʟᴏ ꜱᴛᴀᴄᴋᴏᴠᴇʀꜰʟᴏᴡ, используя, например, этот веб-сайт. Всякий раз, когда я читаю этот текст из файла или помещаю этот текст непосредственно в мой исходный код, используя std::string, визуализатор текста в Visual Studio показывает его в неправильной кодировке, предположительно, визуализатор использует Windows (ANSI). Как я могу заставить Visual Studio позволить мне правильно работать со строками UTF-8?

std::string message_or_file_path = "...";
auto message = message_or_file_path;

// If the file path is valid, read from that file
if (GetFileAttributes(message_or_file_path.c_str()) != INVALID_FILE_ATTRIBUTES
    && GetLastError() != ERROR_FILE_NOT_FOUND)
{
    std::ifstream file_stream(message_or_file_path);
    std::string text_file_contents((std::istreambuf_iterator<char>(file_stream)),
        std::istreambuf_iterator<char>());
    message = text_file_contents; // Displayed in wrong encoding
    message = "ʜᴇʟʟᴏ ꜱᴛᴀᴄᴋᴏᴠᴇʀꜰʟᴏᴡ"; // Displayed in wrong encoding
   std::wstring wide_message = L"ʜᴇʟʟᴏ ꜱᴛᴀᴄᴋᴏᴠᴇʀꜰʟᴏᴡ"; // Displayed in correct encoding
}

Я попробовал дополнительный параметр командной строки /utf-8 для компиляции и установки языкового стандарта:

std::locale::global(std::locale(""));
std::cout.imbue(std::locale());

Ни один из них не исправил проблему кодировки.

Ответы [ 2 ]

3 голосов
/ 31 января 2020

С Что не так с моими строками UTF-8 в Visual Studio? , есть несколько способов просмотреть содержимое std::string с кодировкой UTF-8.

Допустим, у вас есть переменная со следующей инициализацией:

std::string s2 = "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c";

Использовать окно наблюдения.

  • Добавить переменную для просмотра.
  • В окне просмотра , добавьте ,s8 к имени переменной, чтобы отобразить ее содержимое в формате UTF-8.

Вот что я вижу в Visual Studio 2015.

image

Использование окна команд.

  • В окне команд используйте ? &s2[0],s8, чтобы отобразить текст в формате UTF-8.

Вот что Я вижу в Visual Studio 2015.

image

0 голосов
/ 01 февраля 2020

Рабочим решением было просто переписать все std::string s как std::wstring s и корректно настроить logi c кода для работы с std::wstring s, как также указано в вопросе. Теперь все работает как положено.

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