Java如何处理路径中的非unicode数据

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

在 Rust 中,操作系统文件路径使用特定的

Path
类型而不是
str
来存储。这是因为
str
表示 UTF-8 字节序列,而内核要么不强制执行任何类型的编码 (Unix),只要斜线用其 ASCII 代码点表示,要么以 16 位编码进行编码( Windows)。

在Java中,路径使用标准库中的String类型来表示,该类型内部使用UCS-2。这不是特定于实现的,因为某些 String 方法会以某种方式“泄漏”此编码。

Java 如何将 Unix 的任意字节序列路径表示为 Unicode?我假设它将路径视为 ASCII 或 UTF-8,以便将“原始”字节映射到 Unicode 代码点,因为路径实际上几乎总是 ASCII 或 UTF-8,但是如果存在无效的字节序列怎么办ASCII 还是 UTF-8?到 Unicode/UCS-2 的转换是否无损?是否有可来回记录的算法?如果我不想排除非拉丁字母用户,在处理 Java 中的文件路径时我应该考虑什么?

java unicode character-encoding ucs2
1个回答
0
投票

你的问题不清楚,但这里是。

Java 作为平台的设计中的一个主要问题是您与主机操作系统的细节隔离。

其中包括有关主机操作系统所使用的文件系统的详细信息。如果您使用捆绑的 Java 类与文件交互(提示:NIO.2),那么您无需关心主机操作系统文件系统内部的位和字节。处理这些文件系统详细信息是 (a) 编写操作系统的人员和 (b) 编写 Java 实现(例如 OpenJDK)的人员的工作。 Java 的部分乐趣并不在于处理这些事情。

例如,我在 macOS Sonoma 14.4.1 的 Finder.app 中创建了嵌套的文件夹层次结构。我使用谷歌翻译翻译了俄语中的“苹果”,罗马尼亚语中的“香蕉”,日语中的“胡萝卜”。在该文件夹中,我创建了一个 UTF-8 编码的纯文本文件,名称为法语“data”。该文件包含一行:

Bonjour!

使用 Java NIO.2,我通过

Path
(复数)类用
Paths
对象表示该文件的路径。

final String HOME = System.getProperty( "user.home" );  // /Users/basil_dot_work for me on macOS.
final Path path = Paths.get( HOME, "Яблоко" , "Banană" , "にんじん" , "données.txt" ); // Apple in Russian, Banana in Romanian, Carrot in Japanese.

这里的重点是,我不知道苹果工程师如何在各个文件夹名称中对各种语言进行编码。我不在乎。 Java 代表我负责与 macOS 文件系统进行交互。它的工作原理要感谢 Apple 开发人员和任何其他为 OpenJDK 项目 macOS 分支做出贡献的人。

接下来,我使用

Files.lines
打开该文件来读取
Stream
行,每行都是
String
对象。

try
{
    Files
            .lines( path , StandardCharsets.UTF_8 )
            .forEach( System.out :: println );
} catch ( IOException e )
{
    throw new RuntimeException( e );
}

在 Java 22 中运行时的结果:

你好!

© www.soinside.com 2019 - 2024. All rights reserved.