读/写unicode文件名时如何区分文件名?

问题描述 投票:0回答:1

我正在写

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

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

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

如果你写

καθέδρᾳ.txt
然后
καθέδραι.txt
你最终只有第一个文件名。

如果你写

καθέδραι.txt
然后
καθέδρᾳ.txt
你最终只有第一个文件名。

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

file go unicode filesystems
1个回答
0
投票

这(全部)对我来说是希腊语


Unicode 不会处理所有可能的情况。

Unicode 似乎没有处理 handle ancient Greek iota subscript 不正确的双元音。显然,Apple 文件系统确实将双元音

αι
和不正确的双元音
等同地进行了比较。

不同的文件命名规则并不是什么新鲜事。 Linux 区分大小写。 Windows 不区分大小写。

Windows:命名文件、路径和命名空间

不要假设区分大小写。例如,考虑名称 OSCAR、Oscar 和 oscar 是相同的,即使某些文件系统(例如符合 POSIX 的文件系统)可能认为它们不同。


在 Linux 上,文件名是唯一的。

package main

import (
    "fmt"
    "os"
)

func main() {
    filenames := []string{
        `καθέδρα.txt`,
        `καθέδρᾳ.txt`,
        `καθέδραι.txt`,
    }
    for _, filename := range filenames {
        fmt.Printf("%q\n", filename)
        fmt.Printf("%U\n", []rune(filename))
        f, err := os.Create(filename)
        if err != nil {
            fmt.Println(err)
            continue
        }
        err = f.Close()
        if err != nil {
            fmt.Println(err)
            continue
        }
    }
}

Linux:

$ rm καθέδρ*.txt
$ dir καθέδρ*.txt
dir: cannot access 'καθέδρ*.txt': No such file or directory
$ go run diphthong.go
"καθέδρα.txt"
[U+03BA U+03B1 U+03B8 U+03AD U+03B4 U+03C1 U+03B1 U+002E U+0074 U+0078 U+0074]
"καθέδρᾳ.txt"
[U+03BA U+03B1 U+03B8 U+03AD U+03B4 U+03C1 U+1FB3 U+002E U+0074 U+0078 U+0074]
"καθέδραι.txt"
[U+03BA U+03B1 U+03B8 U+03AD U+03B4 U+03C1 U+03B1 U+03B9 U+002E U+0074 U+0078 U+0074]
$ dir καθέδρ*.txt
καθέδρα.txt  καθέδρᾳ.txt  καθέδραι.txt
$ 
© www.soinside.com 2019 - 2024. All rights reserved.