Определите кодировку ввода, изучив входные байты - PullRequest
9 голосов
/ 13 января 2010

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

Как определить входную кодировку, изучив байтыввода?

Ответы [ 5 ]

3 голосов
/ 13 января 2010

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

2 голосов
/ 13 января 2010

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

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

0 голосов
/ 13 января 2010

Как уже было сказано в ответ на вопрос , на который Джон Уэлдон указал , существует ряд библиотек, которые распознают кодировку символов. Вы также можете взглянуть на источник команды unix file и посмотрите, какие тесты она использует для определения кодировки файлов. Со страницы руководства file:

ASCII, ISO-8859-x, 8-разрядные наборы расширенных ASCII не-ISO (например, используемые в системах Macintosh и IBM PC), Unicode в кодировке UTF-8, Unicode в кодировке UTF-16 и Наборы символов EBCDIC могут различаться по различным диапазонам и последовательностям байтов, которые составляют печатный текст в каждом наборе.

PCRE предоставляет функцию для проверки заданной строки на предмет ее полноты UTF-8.

0 голосов
/ 13 января 2010

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

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

0 голосов
/ 13 января 2010

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

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

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