使用带有//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 ......
答案 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表示输入正常,但由于无法在目标编码中表示,因此删除了一些符号。