20 个版本
新 0.10.10 | 2024 年 8 月 22 日 |
---|---|
0.10.9 | 2024 年 7 月 18 日 |
0.10.8 | 2024 年 6 月 24 日 |
0.10.7 | 2024 年 3 月 14 日 |
0.7.3 | 2023 年 3 月 30 日 |
175 在 文件系统 中
每月下载 456,011 次
在 258 个 crate 中使用 (26 个直接使用)
92KB
2K SLoC
此 crate 包含了一组处理路径及其转换的实用工具。
通常,git
将路径视为字节,但内在地假设在 Windows 上使用非变形的 UTF-8 作为编码。内部,它期望使用斜杠作为路径分隔符,文件中的路径必须包含斜杠,在 Windows 上进行相应的转换。
研究
- Windows
dirent.c
包含所有实现(似乎)打开目录和读取其条目,以及所有路径转换(Windows 的 UTF-16)。这是即时完成的,以便 git 可以使用 UTF-8。- mingw 用于转换,并且它们在转换期间处理代理字符,可能是一种非严格 UTF-8 转换器?实际上,它使用 WideCharToMultiByte,如果 UTF-8 无效 Unicode(即 Unicode 对),则会失败。
OsString
在 Windows 上已经将字符串存储为 WTF-8,它支持 代理对,这是 UTF-8 不允许的,毕竟它是 UTF-16 特定的,仅用于扩展可编码的代码点。- 关于 WTF-8 的信息性阅读,这是 Rust 内部使用的编码,用于处理代理和非良好形成的代理(那些不在对中的)。
- Unix
学习经验
代理对是一种扩展UTF-16编码中可编码值范围的方法,主要用于Windows和JavaScript中。长期以来,这些用于代理的码点,总是成对使用,并未分配,直到它们用于罕见的表情符号等。Unicode标准并不要求代理必须成对出现,尽管如今在UTF-16中未成对的代理被认为是不规则的,这些不应该被转换为UTF-8等。
这就是我们必须处理to_string_lossy()
的原因,这仅仅是为了这个怪癖。
这也意味着唯一有资格看到转换错误的平台是Windows,而在此平台上,只有较旧的预Vista版本不正确地允许不规则UTF-16字符串。新版本不再执行此类转换,例如,当从UTF-16转换为UTF-8时,将触发错误。
结论
由于现在WideCharToMultiByte(从Vista开始)已修复为产生有效的UTF-8,孤立的代理码点将导致失败,而git
不关心。
尽管如此,我们将这样做,这意味着从现在开始,我们可以在Windows上直接转换为UTF-8,并在必要时冒泡错误,防止潜在的不匹配代理对被gitoxide保存到磁盘上。
尽管错误仅存在于较旧的Windows版本中,但我们将通过可失败函数调用来在类型系统中表示它。调用者可以在结果上调用.expect()
来表示他们不希望处理这个特殊且罕见的情况。请注意,服务器不应该进入会导致恐慌的代码路径。
依赖项
~0.9–8MB
~64K SLoC