SVN:带有特殊字符的文件名(éèà...)

时间:2019-03-13 13:43:52

标签: svn utf-8 character-encoding

我们正在Mac / Windows / Linux上工作。 Windows用户已在Eclipse下使用SVN提交了一些名称包含特殊字符的文件。在MacO上,执行全新签出(使用命令行)时,SVN无法匹配那些目录/文件。

$ svn co [...]
$ svn st
 ?      ShapeLibraries/Cahiers spéciaux
 !      ShapeLibraries/Cahiers spéciaux

[...]

由于文件是UTF-8编码的,所以我使用latin-1查看了字符串,以了解char转换将是什么:

enter image description here

第一个字符串格式错误,而第二个字符串格式正确(UTF8é== Latin1é)

是什么原因造成的?有什么解决方案(除了重命名所有不带特殊字符的文件)?

谢谢

2 个答案:

答案 0 :(得分:1)

这两个名称是不同的Unicode代码点序列。在问题文字上使用JavaScript:

"é".codePointAt(0).toString(16)
> 65

"é".codePointAt(1).toString(16)
> 301

但是

"é".codePointAt(0).toString(16)
> e9

U + 0065是小拉丁字 U + 0301正在合并重音 U + 00E9是带有小写字母的拉丁小写字母E

它们在语义上是相同的。程序应该将它们进行比较。尝试在所有对其的引用中重命名它们:存储库,本地文件系统,项目文件等。

答案 1 :(得分:1)

正如其他人在这里和其他地方提到的,根本原因如下: 对于某些字符,UTF-8允许使用不同的方式对它们进行编码(合成与分解)。 macOS上的文件系统(HFS +或APFS)以标准化分解格式(NFD)编码文件名,而Subversion在添加文件时似乎使用了不同的UTF-8编码。

因此,当从命令行添加名为ä_¥_é_ç_Ø.txt的文件时:

> svn add ä_¥_é_ç_Ø.txt
A       ä_¥_é_ç_Ø.txt

Subversion用不同的编码存储文件名,这会导致问题:

> svn status
?       ä_¥_é_ç_Ø.txt
!       ä_¥_é_ç_Ø.txt

第一行是关于现有文件(其名称是NFD编码的)的信息。该文件存在于文件系统中,但对于Subversion(“?”)而言是未知的。
第二行是关于添加的文件(名称的编码不同)。此文件是Subversion已知的,但在文件系统中不存在(“!”)

要查看不同的编码,请使用xxd:

> svn status | head -1 | xxd; echo; svn status | tail -1 | xxd
00000000: 3f20 2020 2020 2020 61cc 885f c2a5 5f65  ?       a.._.._e
00000010: cc81 5f63 cca7 5fc3 982e 7478 740a       .._c.._...txt.

00000000: 2120 2020 2020 2020 c3a4 5fc2 a55f c3a9  !       .._.._..
00000010: 5fc3 a75f c398 2e74 7874 0a              _.._...txt.

这是我要如何处理,以使Subversion在macOS文件系统上使用UTF-8编码的文件名:

在Subversion中添加或删除文件时,我没有在Subversion命令中键入或自动完成文件名。 相反,我ls文件,复制文件名,并将其粘贴到Subversion命令中,在该命令中将显示编码的实际十六进制代码。
这样做会导致Subversion使用实际的文件名编码,而不是使用转换后的格式。

示例:

> svn status
?       ä_¥_é_ç_Ø.txt
> ls
ä_¥_é_ç_Ø.txt

复制文件名并将其粘贴到以下命令中

> svn add a<0308>_¥_e<0301>_c<0327>_Ø.txt
A         ä_¥_é_ç_Ø.txt
> svn commit -m "Test"
Füge hinzu         ä_¥_é_ç_Ø.txt
Übertrage Daten .erledigt
Übertrage Transaktion...
Revision 4 übertragen.
> svn status
>