这是我使用 UCS-2 编码的示例字符串:
abvgdđežzijklmnjoprstćuvhcčdžš1234567890*+;'
当使用 iconv 二进制文件将 UCS-2 转换为 iso ISO-8859-1//TRANSLIT 时,我得到:
abvgd?ezzijklmnjoprstcuvhccdzs1234567890*+;'
现在我想在 go 项目中使用 libiconv。我正在使用这个库 github.com/qiniu/iconv 作为 libiconv 的绑定。但是当使用绑定时,我得到:
abvgd?e?zijklmnjoprst?uvhc?d??1234567890*+;'
这就像在 go 中使用库时适用不同的音译规则。
我检查了 go bindings 库,一切看起来都井井有条;只有字节被传递,因此不会发生“信息丢失”。
使用 libiconv 时还有什么需要注意的吗?是否有一些环境背景可以触发不同的音译行为?
编辑(关于调用的附加说明):
我有两个文件“ucs-2.txt”和“latin1.txt”。ucs-2.txt 文件包含 UCS-2 编码的字符串,而 latin1.txt 包含通过运行得到的字符串:
iconv -f UCS2 -t ISO-8859-1//TRANSLIT --verbose data/encoding/ucs-2.txt > data/encoding/latin1.txt
在 go 中,我使用这些行从这些文件中提取内容:
var err error
ucs2, err = ioutil.ReadFile("data/encoding/ucs-2.txt")
if err != nil {
log.Fatal(err)
}
latin1, err = ioutil.ReadFile("data/encoding/latin1.txt")
if err != nil {
log.Fatal(err)
}
这个函数正在做转换:
func convertEnc(content []byte) ([]byte, error) {
cd, err := iconv.Open("ISO-8859-1//TRANSLIT", "UCS2")
if err != nil {
return nil, err
}
defer cd.Close()
var outbuf [255]byte
res, _, err := cd.Conv(content, outbuf[:])
log.Printf("result: %+q", res)
return res, err
}
我正在使用 DeepEqual 进行测试:
reflect.DeepEqual(res, latin1)