【发布时间】: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