Iconv:带有ASCII // IGNORE的EILSEQ但不带有ASCII // TRANSLIT // IGNORE

时间:2012-02-12 14:41:59

标签: iconv

使用带有//TRANSLIT//IGNORE的iconv将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 个答案:

答案 0 :(得分:1)

linux上iconv(1)的手册页说明如下:

  -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情况的处理方式相同。

答案 1 :(得分:0)

通过检查输入序列中非法字节的报告偏移量,可以区分输入文本中是否存在非法序列和丢弃某些字符:

  • 当输入确实包含非法序列偏移值时,将在1 … (input_bytes_count)范围
  • 当输入正常但有些字符被删除时,非法序列偏移值将等于input_bytes_count + 1

möp大小为4个字节,因此报告的非法序列偏移量为5表示输入正常,但由于无法在目标编码中表示,因此删除了一些符号。