Не существует такой вещи, как 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.