Я вводил консоль от пользователя и хочу закодировать ее к UTF-8. Моим пониманием является C++, не имеет стандартного кодирования для входных потоков, и что это вместо этого зависит от компилятора, среды выполнения, локализации, и что нет.
Как я могу определить входное кодирование путем исследования байтов входа?
В целом вы не можете. Если я снимаю поток случайно сгенерированных байтов в вашем приложении, как он может определить их «кодирование»? Вам просто необходимо указать, что ваше приложение принимает определенные кодировки, или принять предположение, что то, что вы должны быть подходящими.
Как правило, проверяя, является ли вход UTF - вопрос эвристики - нет окончательного алгоритма, который укажет вас «да / нет». Чем более сложный эвристический, менее ложные позитивы / негативы вы получите, однако не «конечно».
Для примера эвристики вы можете проверить эту библиотеку: http://utfcpp.sourceforge.net/
bool valid_utf8_file(iconst char* file_name)
{
ifstream ifs(file_name);
if (!ifs)
return false; // even better, throw here
istreambuf_iterator<char> it(ifs.rdbuf());
istreambuf_iterator<char> eos;
return utf8::is_valid(it, eos);
}
Вы можете либо использовать его, либо проверить его источники, как они это сделали.
Используйте встроенную операционную систему. Те, которые варьируются от одной ОС к другой. В окнах всегда лучше использовать WideChar API и не думать о кодировании вообще.
И если ваш вход происходит из файла, в отличие от реальной консоли, то все ставки выключены.
Как уже говорилось в ответ на вопрос Вопрос John Weldon указал на , есть ряд библиотек, которые выполняют распознавание персонажа. Вы также можете взглянуть на
Источник файла файл [11138554]
и посмотрите, какие тесты он использует для определения кодировки файлов. От страницы человека файл
:
ASCII, ISO-8859-X, Non-ISO 8-битный расширенный наборы символов ASCII (такие как те, которые используются на Macintosh и IBM PC Systems), UTF- 8-закодированный Unicode Unicode Unicode Unicode UTF-16 и наборы символов EBCDIC можно отличить различными диапазонами и последовательностями байтов, которые составляют печатный текст в каждом наборе.
PCRE предоставляет функцию для проверки заданной строки для ее полностью действительной UTF-8.
Джаред Оберхаус хорошо ответил на этот вопрос , относящийся к java.
В принципе, есть несколько шагов, которые можно предпринять для того, чтобы сделать обоснованное предположение, но в конечном итоге это просто предположение без явных указаний. (Отсюда (in)известный маркер BOM в UTF-8 файлах)
.