git,msysgit,accents,utf-8,最终答案

Ben*_*jol 45 git utf-8 msysgit

我在某些地方读过git(或只是msysgit?)和字符编码有问题- 我相信这只是文件名中的一个问题.

我想要的是一些'权威'(或至少权威)的信息:

  1. 究竟是什么'问题'?(症状)
  2. 原因是什么?(简要)
  3. 在什么情况下这是一个节目塞子?
  4. 是否有任何解决方案,或没有任何解决方法?

我希望这个问题不是太模糊,我认为将所有这些信息放在一个地方以便能够指出人们是很好的...

Von*_*onC 40

2017年2月更新(Git 2.12):字符宽度表已更新为与Unicode 9.0匹配.
update_unicode.sh移至contrib/update-unicode:请参阅其自述文件.

更新2014年8月(GIT 2.1):犯a67c821(托斯滕Bögershausen(tboegi) ),增加对Unicode 7.0的支持.

2014年4月更新:commit d813ab9(TorstenBögershausen(tboegi))增加了对Unicode 6.3
(git 1.9.2)的支持:

Unicode 6.3将更多代码点定义为组合或重音.
例如,字符" ö"可以表示为" o"后跟U+0308 COMBINING DIARESIS(也就是变音符号,上面的双点).
我们应该考虑这样一个由两个代码点组成的序列占用一个显示列以进行对齐,为此,git_wcwidth()应该为它们返回0.

受影响的代码点是:

U+0358..U+035C
U+0487
U+05A2, U+05BA, U+05C5, U+05C7
U+0604, U+0616..U+061A, U+0659..U+065F
Run Code Online (Sandbox Code Playgroud)

早期的unicode标准将这些定义为"保留".

0..U+07FF在准备此提交时,仅检查范围以查看哪些代码点需要标记为0宽度; 可能需要更多更新.


2012年4月更新:版本1.7.10中发布了Unicode支持.有关您应设置的注释和设置,请参阅此页面.

即:

git config [--global] core.quotepath off
git config [--global] i18n.logoutputencoding utf8
git config [--global] i18n.commitencoding utf8
git config [--global] --unset svn.pathnameencoding
Run Code Online (Sandbox Code Playgroud)

recodetree check命令扫描git存储库的整个历史记录并打印所有非ASCII文件名.如果输出为空,则不需要迁移.


更新2012年2月:UTF-8支持的补丁正在GitHub上msysgit repo的分支'devel'中进行,包括更新UTF-8的设置.

Git for Windows Google+页面提到:

Karsten Blees用于Windows的Git的UTF-8补丁现已合并为' devel'.
这意味着即将发布的版本将支持Unicode文件名!


2011年5月

我相信msysgit问题80有关于该bug的最新信息.
还在问题376中描述.

例如:

这是发生的事情:

  1. Windows上的git对文件名进行操作,并将它们视为字节流.在您的情况下,流恰好是UTF8编码的文本.

  2. Windows上的git要求运行时创建一个文件,并将其传递给字节流.

  3. 由于Windows内部的一切都是Unicode,运行时使用当前设置的语言环境(也就是"代码页")将字节流转换为UTF16.
    也就是说,它有效地将字节流解释为CP949(韩文)编码文本.
    显然,一些UTF8字节序列是无效的CP949序列,转换失败("无效参数"); 或者如果UTF8序列碰巧是正确的CP949序列,则结果(很可能)是不同的字符.

真正的解决方案 应该是MingW:

在我看来,一个解决方案就是:在GCC C运行时库级别解决它.
也就是说,对于Windows上的mingw GCC运行时库,可以通过构建时选项使命令行参数(传递给main())和文件I/O函数使用基础Windows Unicode API调用的模式成为可能. ,并在C的使用字节字符串的标准函数API中转换为/从UTF-8编码转换.
这对git来说"只是工作",并且可能对运行Windows环境的其他Linux源代码开源项目有用.

ak2评论说MingW不适合这个修复:

"MinGW编译器提供对Microsoft C运行时功能和某些特定于语言的运行时的访问
.MinGW是Minimalist,不会,也绝不会尝试为MS-Windows上的POSIX应用程序部署提供POSIX运行时环境.
如果你想要在这个平台上部署POSIX应用程序,请考虑使用Cygwin."

msysgit变体上有一些工作正在进行以支持unicode.