首页 > 文章列表 > 如何正确处理unicode文件名的读写?

如何正确处理unicode文件名的读写?

110 2024-02-21
问题内容

我正在编写 go 代码,但我不相信它是独一无二的,所以让我们概括一下它。想象一下,用户通过 go 代码创建了三个具有三个不同 unicode 名称的文件。请注意文件名的最后一个字母是不同的。

  • καθέδρα.txt
  • καθέδρᾳ.txt
  • καθέδραι.txt

go中,这三个字符串是三个不同的唯一字符串。看起来,如果您尝试使用这三个名称创建三个文件,最终会得到两个文件保存到磁盘上。第二个和第三个文件名似乎被视为相同的文件。因此,当脚本写入三个用户创建的文件时,其中一个会“丢失”。

如果你写 καθέδρᾳ.txt 然后 καθέδραι.txt 你最终只会得到第一个文件名。

如果你写 καθέδραι.txt 然后 καθέδρᾳ.txt 你最终只会得到第一个文件名。

如何在 golang 中防范 unicode 中奇怪的 OS/X 文件名行为?它似乎认为两个不同的字符串是一个文件名。


正确答案


当您在 OS/X 上选择不区分大小写的文件系统时,不区分大小写的过程比我们的直觉预期更复杂。根据语言的不同,规则也不同。

  • 大写的 a 是 A(英文)。
  • I 的大写表示 ï 某些语言。
  • 显然 ᾳ 等于 αι。

除了检测文件系统类型之外,没有真正的方法可以防止这种情况。

防止该问题的跨平台方法是让您的软件写入一个文件并使用不同的“案例”读回该文件以检测问题是否存在。