Определите входное кодирование путем исследования входных байтов

Я вводил консоль от пользователя и хочу закодировать ее к UTF-8. Моим пониманием является C++, не имеет стандартного кодирования для входных потоков, и что это вместо этого зависит от компилятора, среды выполнения, локализации, и что нет.

Как я могу определить входное кодирование путем исследования байтов входа?

9
задан Raedwald 12 December 2017 в 13:25
поделиться

5 ответов

В целом вы не можете. Если я снимаю поток случайно сгенерированных байтов в вашем приложении, как он может определить их «кодирование»? Вам просто необходимо указать, что ваше приложение принимает определенные кодировки, или принять предположение, что то, что вы должны быть подходящими.

3
ответ дан 3 November 2019 в 07:13
поделиться

Как правило, проверяя, является ли вход 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);
}

Вы можете либо использовать его, либо проверить его источники, как они это сделали.

2
ответ дан 3 November 2019 в 07:13
поделиться

Используйте встроенную операционную систему. Те, которые варьируются от одной ОС к другой. В окнах всегда лучше использовать WideChar API и не думать о кодировании вообще.

И если ваш вход происходит из файла, в отличие от реальной консоли, то все ставки выключены.

0
ответ дан 3 November 2019 в 07:13
поделиться

Как уже говорилось в ответ на вопрос Вопрос 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.

0
ответ дан 3 November 2019 в 07:13
поделиться

Джаред Оберхаус хорошо ответил на этот вопрос , относящийся к java.

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

.
0
ответ дан 3 November 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: