【发布时间】:2021-10-31 11:39:19
【问题描述】:
我必须定期将包含 uft-8-mac 字符串的文件转换为 uft-8。我开始使用 iconv 完成这项工作。 如果必须转换的行太多,iconv 会如何引发错误。 这是一个重现错误的脚本
#!/bin/zsh
set -eu
for i in {1..1000}; do
echo "$i:äöüß@€" >> /tmp/xx
iconv -f utf-8-mac -t utf-8 /tmp/xx > /dev/null
done
显然我可以拆分文件,但我会得到很多文件。
还有其他解决方法或工具吗?还是golang中的代码示例?
我试过了
func main() {
dat, err := os.ReadFile(".backup_files.unconv")
if err != nil {
log.Fatal(err)
}
output := ".backup_files.goconv"
w, err := os.Create(output)
if err != nil {
log.Fatalf("Can't create %s, %v", output, err)
}
defer closeFile(w)
wc := norm.NFC.Writer(w)
defer wc.Close()
wc.Write(dat)
}
但它与 iconv 结果不同。 提前致谢。
【问题讨论】:
-
这绝对是苹果版iconv的bug。我无法确定根本原因,但这与文件本身的大小无关。就是 4096 字节的缓冲区大小恰好分割了一个字符。它在将
:\xc3传递给转换器时失败。这是冒号后跟 ä 的第一个字节,但没有第二个字节。如果您使用边界(例如在文件开头添加一个字节),您可以移动故障。我会向 Apple 提出反馈意见。 -
源代码在这里:opensource.apple.com/source/libiconv/libiconv-59 您想在
utf8mac.h中查找相关的 Apple 代码。要构建它,只需删除 base.xcconfig 中的#include行,并将 GCC_OPTIMIZATION_LEVEL 更改为 0。 -
也就是说,当你说 Go 代码“与 iconv 结果不同”时,有什么区别?你的 Go 代码感觉是绕过 Apple 错误的好方向。您可以解决它的另一种令人讨厌的方法是读取
-
感谢您的分析和提示。我已经给了苹果反馈,所以他们可以修复它。不幸的是,他们没有错误跟踪器:-/