【问题标题】:How to effectiv convert utf-8-mac to utf如何有效地将 utf-8-mac 转换为 utf
【发布时间】: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 错误的好方向。您可以解决它的另一种令人讨厌的方法是读取
  • 感谢您的分析和提示。我已经给了苹果反馈,所以他们可以修复它。不幸的是,他们没有错误跟踪器:-/

标签: macos utf-8 iconv


【解决方案1】:

找到合适的解决方案: 您可以使用来自ICUuconv 实用程序。 Normalization是通过音译(-x)实现的。

在 Debian、Ubuntu 和其他衍生产品上,uconv 位于 libicu-dev 包中。在 Fedora、Red Hat 和其他衍生产品中,以及在 BSD 端口中,它位于 icu 包中。

感谢Gilles 'SO- stop being evil'

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2019-05-15
    • 2017-09-24
    相关资源
    最近更新 更多