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

标签 c go iconv libiconv

这是我使用的以 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 的绑定(bind)。但是当使用绑定(bind)时,我得到:

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)

最佳答案

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

第二个输出没有音译任何东西,它丢弃了目标编码中无法表示的所有字符(žć、……在 Latin-1 中)。

因此,我怀疑您可以使用与库不同的选项来生成二进制文件。不熟悉libiconv,似乎//TRANSLIT部分被遗漏了或者你使用的函数不支持...?

关于c - 为什么在使用 libiconv 而不是 iconv 二进制文件时会得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31810729/

相关文章:

c - 是否可以将结构转换为另一个结构?

go - 如何处理 Response JSON 有没有键的自定义字段?

ruby - 在使用 Mechanize 进行抓取时,我总是在 Ruby 2.0 中遇到 UndefinedConversionError

php - iconv UTF-8//忽略仍然产生 "illegal character"错误

有符号/无符号值与负值之间的比较

c - C 优化编译器 (GCC) 是否能够在不使用 'const' 的情况下检测只读访问的不变值?

function - Context struct 在 golang gin 框架中如何工作?

bash - 使用 find 和 iconv 更改文件名

c++ - 创建并链接到从旧 DLL 文件生成的 .lib 文件

google-app-engine - GO 在哪里寻找 google-cloud-sdk ? GOPATH 应该是什么?