Как использовать символы Unicode / эмодзи в необработанных строковых литералах в MSVC - PullRequest
0 голосов
/ 28 ноября 2018

Есть ли способ определить, какую конкретную кодировку использует моя std :: string?Как насчет того, как это будет обрабатываться из std :: string position, если string будет выглядеть так std::string("This is a test");, а другой будет использовать символы не ASCII, такие как std::string("This is a russian alphabet: Ребята сдохли");?Мне нужно это знать, чтобы я мог преобразовать этот тип строки с "const char *" в качестве аргумента конструктора в кодированный в UTF-8 std :: string.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Решение моей проблемы было #pragma execution_character_set("utf-8").Эта строка дала мне возможность использовать строки вроде string data("?");, и MSVS правильно кодирует их в что-то вроде

0 голосов
/ 28 ноября 2018

Не существует такой вещи, как std::string кодировка.A std::string содержит байты.Период.Это std::vector<char> с некоторыми ASCII-дружественными вспомогательными функциями.

Эти байты могут интерпретироваться почти бесконечными способами - как ASCII, как UTF-8, как Shift-JIS ... в некоторых ситуациях вы можете сортироватьугадайте кодировку, если вы знаете достаточно о проблемной области, и вы могли бы сделать что-то вроде поиска спецификации UTF-8 в начале , но ее отсутствие не означает, что строка неUTF-8 и его присутствие не обязательно означают, что это так - это могут быть некоторые байты, которые выглядят как спецификации (этот связанный ответ кажется мне оптимистичным).В целом это все равно, что пытаться вытащить нефть из воды.

Если вам нужно знать кодировку получаемой последовательности байтов, вам понадобится объект, который отправляет их, чтобы сообщить вам, что это за кодировка.(некоторые поля Exif используют префикс 8-символьного тега в ASCII, который объявляет кодировку оставшейся части текстового блока), или иным образом документируют соглашение, которое оба конца будут использовать, например, UTF-8, затем требуют соблюдения этого соглашения,и выводить сообщения об ошибках / исключения, если встречается несовместимая последовательность байтов.

Лично я склонен полагать, что ASCII или UTF-8 (как требуется) во всех моих приложениях, и в точке ввода выполнить преобразование, если яполучаю текст из источника, который, как известно, кодируется как-то еще.

Не забывайте также, что если ваша строка не является ASCII (или другой однобайтовой кодировкой), то элементарные операции с ней не выполняютсяработать правильно.Вам понадобится библиотека, которая интерпретирует компонент, кодирующий домен символов строки и работает с этим разрешением, а не на уровне байтов.Существует множество существующих достойных библиотек для управления различными кодировками Unicodey.

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