【问题标题】:java reads file system file names differently on osx and linuxjava在osx和linux上以不同方式读取文件系统文件名
【发布时间】:2017-04-15 20:50:09
【问题描述】:

我有一个几乎可以完美运行的 java 程序。我正在Mac上开发并推送到Linux进行生产。当 mac 搜索文件系统并将新文件名插入数据库时​​,它工作得很好。但是,当我推到 linux 框并进行搜索/插入时,它会找到一些字符为不同 IE 的文件:Béla Fleck。它们在数据库和 mac 和 linux 文件系统上看起来与我相同。事实上,mac 和 linux 机器将 NFS 挂载到文件所在的第三个系统 (linux)。

我已经转储了字节并且可以看到 linux 和 mac 如何从文件系统中看到字符串:Béla Fleck。

Linux:

utf8bytes[0] = 0x42
utf8bytes[1] = 0x65
utf8bytes[2] = 0xcc
utf8bytes[3] = 0x81
utf8bytes[4] = 0x6c
utf8bytes[5] = 0x61
utf8bytes[6] = 0x20
utf8bytes[7] = 0x46
utf8bytes[8] = 0x6c
utf8bytes[9] = 0x65
utf8bytes[10] = 0x63
utf8bytes[11] = 0x6b

linux says LANG=en_US.UTF-8

苹果:

utf8Bytes[0] = 0x42
utf8Bytes[1] = 0xc3
utf8Bytes[2] = 0xa9
utf8Bytes[3] = 0x6c
utf8Bytes[4] = 0x61
utf8Bytes[5] = 0x20
utf8Bytes[6] = 0x46
utf8Bytes[7] = 0x6c
utf8Bytes[8] = 0x65
utf8Bytes[9] = 0x63
utf8Bytes[10] = 0x6b

mac says LANG=en_US.UTF-8

试过了,还是不开心。

java -Dfile.encoding=UTF-8

我正在使用java nio文件来获取目录:

java.nio.file.Path path = Paths.get("test");

然后与

一起走这条路
Files.walkFileTree(path, new SimpleFileVisitor<Path>() {

然后,因为这是测试路径中的子目录:

 file.getParent().getName(1).toString()

任何人对这里的故障以及如何解决此问题有任何想法?

谢谢。

【问题讨论】:

  • 它们看起来相同,因为 Mac 文件名包含一个带重音的“e”字符 (é),而 Linux 文件名包含一个普通的“e”字符后跟一个组合重音 (@987654329 @)。从视觉上看,它们看起来相同,大多数Collators 会认为它们相同。至于它们为什么不同,如果不查看获取/创建文件名的代码,就很难说清楚。
  • 添加了 java.nio.file 调用

标签: java linux macos utf-8 locale


【解决方案1】:

(不是真正的答案,只是更多的讨论。)

这些似乎是 utf8 字符,但以不同的方式形成。

c4a9é -- 通常这是输入重音字母的方式。

但是,可以使用一对字符:

65cc91,但由e 和“组合倒置短”组合而成。 c3aa 是单个字符 ê

一些COLLATIONs 可以弥补这些差异,但应用程序可以在击键时将它们组合起来。

SELECT CAST(UNHEX('65cc91') AS CHAR) =
       CAST(UNHEX('c3aa') AS CHAR) COLLATE utf8_unicode_520_ci;  --> 1

【讨论】:

    【解决方案2】:

    一些搜索显示 OS X 总是分解文件名:

    这表明你可能不小心切换了输出:第一个字节数组被分解了,所以我猜它来自 Mac,而第二个来自 Linux。

    无论如何,如果您希望它们对所有系统都相同,您可以自己进行分解:

    String name = file.getParent().getName(1).toString();
    name = Normalizer.normalize(name, Normalizer.Form.NFD);
    

    【讨论】:

    • 是时候让我了解一下您所说的 Normalizer 在做什么了。正如你所说的那样工作。
    • documentation for Normalizer 包含一个指向 Unicode 规范的链接,该规范阐述了规范化的概念。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多