Iconv: EILSEQ с ASCII // IGNORE, но не с ASCII // TRANSLIT // IGNORE - PullRequest
4 голосов
/ 12 февраля 2012

Использование iconv с //TRANSLIT//IGNORE для преобразования из utf8 в ascii работает нормально;он заменяет неконвертируемые символы на правильную транслитерацию в соответствии с текущей локалью (в моем случае это de_DE):

> echo 'möp' | iconv -f 'UTF8' -t 'ASCII//TRANSLIT//IGNORE'
moep

Однако при использовании //IGNORE без //TRANSLIT выдается ошибка:

> echo 'möp' | iconv -f 'UTF8' -t 'ASCII//IGNORE'
mp
iconv: illegal input sequence at position 5

Интересно, почему это происходит?Последовательность ввода точно такая же, и не следует ли //IGNORE просто пропускать недопустимые символы?При использовании iconv C api я получаю ошибку EILSEQ - поэтому я не знаю, содержала ли входная строка недопустимый UTF8 или нет ...

Ответы [ 2 ]

1 голос
/ 28 августа 2015

Страница руководства для iconv (1) в linux говорит следующее:

  -t to-encoding, --to-code=to-encoding
         Use to-encoding for output characters.

         If the string //IGNORE is appended to to-encoding, characters
         that cannot  be  converted  are discarded and an error is printed 
         after conversion.

Он пропускает символ, но также вызывает ошибку в конце.

Кажется, что, используя // IGNORE, вы действительно не можете различить случаи с недопустимыми символами на входе и неконвертируемыми символами. Другими словами, ситуации EILSEQ и EINVAL обрабатываются одинаково.

0 голосов
/ 05 июня 2018

Можно различить наличие недопустимой последовательности во входном тексте и некоторых символов, отбрасываемых путем изучения сообщенного смещения недопустимого байта во входной последовательности:

  • когда вход действительно содержит недопустимую последовательность, значение смещения будет в 1 … (input_bytes_count) диапазоне
  • когда ввод был в порядке, но некоторые символы были отброшены, недопустимое значение смещения последовательности будет равно input_bytes_count + 1

möp размер составляет 4 байта, поэтому сообщенное смещение недопустимой последовательности, равное 5, указывает на то, что ввод был в порядке, но некоторые символы были отброшены, поскольку они не могли быть представлены в целевом кодировании.

...