为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在使用 libiconv 而不是 iconv 二进制文件时会得到不同的结果?

为什么在使用 libiconv 而不是 iconv 二进制文件时会得到不同的结果?

Go
30秒到达战场 2021-10-25 20:17:13
这是我使用的 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 中使用 library 时应用不同的音译规则一样。我检查了 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 errorucs2, 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)
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

第一个输出包括音译,即某些字符(例如ž)被音译为它们不太正确的“普通”对应物 ( z) 以便在不支持原始字符的编码中表示(此处ž为 Latin-1) .

第二个输出没有转写任何内容,它删除了目标编码中无法表示的任何字符(拉丁语 1 中的žć, ... )。

因此,我怀疑您可以使用与库不同的选项的二进制文件。不熟悉libiconv,好像//TRANSLIT是省略了部分或者你使用的函数不支持...?


查看完整回答
反对 回复 2021-10-25
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

音译取决于语言环境。可能是你的 libiconv 缺少/有错误的语言环境。或者您在那里使用的语言环境没有配置音译。



查看完整回答
反对 回复 2021-10-25
  • 2 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信