首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SVN :带有特殊字符的文件名(éèà...)

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

Stack Overflow用户
提问于 2019-03-13 21:43:52
回答 2查看 745关注 0票数 1

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

代码语言:javascript
运行
复制
$ svn co [...]
$ svn st
 ?      ShapeLibraries/Cahiers spéciaux
 !      ShapeLibraries/Cahiers spéciaux

[...]

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

第一个字符串格式错误,而第二个字符串没有问题(UTF8é== Latin1ç©)

你知道这是什么原因吗?是否有任何解决方案(除了重命名所有不带特殊字符的文件)?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2019-12-01 22:25:16

正如其他人在这里和其他地方提到的,根本原因如下:对于某些字符,UTF-8允许以不同的方式对它们进行编码(合成和分解)。

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

代码语言:javascript
运行
复制
> svn add ä_¥_é_ç_Ø.txt
A       ä_¥_é_ç_Ø.txt

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

代码语言:javascript
运行
复制
> svn status
?       ä_¥_é_ç_Ø.txt
!       ä_¥_é_ç_Ø.txt

第一行是关于现有文件(其名称为NFD编码)。此文件存在于文件系统中,但Subversion ("?")未知。

第二行是关于添加的文件(其名称的编码方式不同)。Subversion已知此文件,但文件系统中不存在此文件("!")

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

代码语言:javascript
运行
复制
> 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使用实际的文件名编码,而不是使用转换后的形式。

示例:

代码语言:javascript
运行
复制
> svn status
?       ä_¥_é_ç_Ø.txt
> ls
ä_¥_é_ç_Ø.txt

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

代码语言:javascript
运行
复制
> 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
> 
票数 2
EN

Stack Overflow用户

发布于 2019-03-14 01:18:21

这两个名称是不同的Unicode码点序列。对问题中的文本使用JavaScript:

代码语言:javascript
运行
复制
"é".codePointAt(0).toString(16)
> 65

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

代码语言:javascript
运行
复制
"é".codePointAt(0).toString(16)
> e9

U+0065是拉丁文小写e U+0301是组合锐音U+00E9是拉丁文小写字母E和锐音

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55143357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档