如何在 Windows 上使用不属于 UTF-8 的字符创建文件名?

Posted

技术标签:

【中文标题】如何在 Windows 上使用不属于 UTF-8 的字符创建文件名?【英文标题】:How to create filename with characters that are not part of UTF-8 on Windows? 【发布时间】:2021-12-15 06:16:57 【问题描述】:

[编辑/免责声明]:评论指出我必须澄清用户使用的编码。会相应更新

我有一位来自中国的客户最近报告了他们在 Windows 上的文件名问题。该软件适用于大多数汉字,但他似乎找到了一个失败的文件。

不幸的是,他们无法通过文件名向我发送文件,因为压缩或通过其他媒体传输文件似乎都无法保留文件名。

在 Windows 上生成文件名的最简单方法是什么(例如通过 Python),该文件名被 NTFS 文件系统编码覆盖但UTF8 不覆盖?

【问题讨论】:

请edit您的问题提供minimal reproducible example。 不幸的是,没有最小的可重现示例。这个问题很清楚imo 这个问题完全不清楚。请举一个至少一个失败字符的例子…… UTF-8 支持所有 Unicode 码位。 Windows 内部使用 UTF-16,它也支持所有 Unicode 代码点。也许客户的字体不支持该字符,或者该字符尚未分配 Unicode 代码点? @HelloWorld [1] 好的,明白,但为了避免 X-Y 问题,我认为最好只发布最后一段作为整个问题。 [2] 也就是说,我怀疑您通过关注 NTFS 而不是源和目标环境走错了路。因此,我建议关注您的环境中使用的代码页、语言环境和 Windows 版本,以及创建有问题文件的用户。然后相应地更新您的问题。 [3] 你能得到文件名的图像吗?显然不理想,但总比没有好。 【参考方案1】:

Unicode 字符串被编码为一系列字节。一系列字节在操作系统中的视觉外观规则是操作系统用来将字节转换为字符的规则。

鉴于 Windows 使用(变体)Unicode,并且您说您有一个不是 unicode 的字符,这也意味着根本无法表示该字符。

想象一下,如果 unicode 只包含数字 0-9,而你问某人如何编码字母 A。没有答案,因为只定义了 0-9。

您可以为您的角色创建一个新的 unicode 代码点,但除非您也制作自己的字体文件,否则操作系统将不知道如何处理它。

我不知何故怀疑那是你想要做的,但这是一个选择。您的客户能否在将文件发送给您之前重命名文件?

【讨论】:

非常感谢您的见解!但如果我没记错的话,那是不正确的。在您的示例中,您定义了 0 到 9,但 Unicode 具有某些未分配的代码点。所以例子是0-47-9 所以在我的情况下,我正在寻找一个似乎对 NTFS 有效但未分配为有效 unicode 代码点的代码点(分别由 utf-8 编码覆盖) @HelloWorld 不,NTFS 使用 UTF-16,它支持所有 Unicode 代码点(甚至未分配)。 有道理。明白了,非常感谢! @HelloWorld 当然,有些字符不能在文件名中使用,例如\<>:,如果 application 为不支持Unicode。见Naming Files...。

以上是关于如何在 Windows 上使用不属于 UTF-8 的字符创建文件名?的主要内容,如果未能解决你的问题,请参考以下文章

不属于 windows 组或活动目录的人将如何访问 TFS 项目?

如何在Windows控制台中显示utf-8

如何从 Windows 上的 c++ 控制台应用程序打印 UTF-8

如何在Windows上配置并运行Nginx

Windows 中的 UTF-8

如何在WLATIN1编码的SAS会话中使用UTF-8编码的文件?