混帐,msysgit,口音,utf-8,明确的答案

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

我想要的是一些关于以下方面的“权威”(或至less是权威的)信息:

  1. 究竟是什么“问题”? (症状)
  2. 是什么原因? (简要)
  3. 在什么情况下这是一个显示塞?
  4. 有没有解决方法,或者没有任何解决方法?

我希望这个问题不是太模糊,我认为把所有这些信息都集中在一个地方是很好的。

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

更新2014年8月(git 2.1): 提交a67c821 (TorstenBögershausen(tboegi) )增加了对Unicode 7.0的支持。

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

Unicode 6.3将更多的代码点定义为组合或者重音
例如,字符“ ö ”可以表示为“ o ”,然后是U+0308 COMBINING DIARESIS (也称为变音符,双点以上)。
我们应该考虑这样一个两个代码点的序列占用一个显示列以便alignment,为此, 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 

之前的unicode标准已经将这些定义为“保留”。

只有范围0..U+07FF已经被检查,看看哪些代码点需要被标记为0宽度,而准备这个提交; 可能需要更多更新。


2012年4月更新:Unicode版本支持在版本1.7.10中发布。 看到这个页面的笔记和设置你应该设置。

即:

 git config [--global] core.quotepath off git config [--global] i18n.logoutputencoding utf8 git config [--global] i18n.commitencoding utf8 git config [--global] --unset svn.pathnameencoding 

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


2012年2月更新:UTF-8支持的补丁正在GitHub上的msysgit repo的分支“devel”中提供 ,包括更新less于UTF-8的设置 。

Git for Windows Google+页面提到:

Karsten Blees的Git for Windows UTF-8补丁现在已经被合并为“ devel ”。
这意味着即将发布的版本将支持Unicode文件名!


2011年5月

我相信msysgit问题80有最新的错误。
也在问题376中描述。

例如:

这是发生了什么事情:

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

  2. 在Windows上git要求运行时创build一个文件,并将其传递给字节stream。

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

真正的修复 应该在MingW上

对我来说,一个解决scheme就是:在GCC C运行库级别解决这个问题。
也就是说,对于Windows上的mingw GCC运行时库,通过构build时间选项可以使命令行参数(传递给main() )和文件I / O函数使用基础Windows Unicode API调用,并在使用字节string的C标准函数API中转换为UTF-8编码。
这对于git来说可能“只是工作”,对于运行Windows环境的其他源于Linux的开源项目也是有用的。

ak2评论说MingW不是这个修复的正确位置:

“MinGW编译器提供对Microsoft C运行时function和一些语言特定运行时的访问。
MinGW是极简主义者,不会尝试为MS-Windows上的POSIX应用程序部署提供POSIX运行时环境。
如果你想在这个平台上部署POSIX应用程序,请考虑使用Cygwin。“

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