Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';我不能让git与iconv和utf-16玩得很好_Git_Utf 16_Msysgit_Iconv - Fatal编程技术网

Can';我不能让git与iconv和utf-16玩得很好

Can';我不能让git与iconv和utf-16玩得很好,git,utf-16,msysgit,iconv,Git,Utf 16,Msysgit,Iconv,我正试图让git将UTF-16识别为文本,以允许我在本地将其作为文本进行区分和修补,但我在使textconv参数正常工作时遇到了问题 我可以手动打电话 iconv -f utf-16 -t utf-8 some-utf-16-file.rc 一切都很好。但是如果我按照如下方式配置我的.gitconfig [diff "utf16"] textconv = "iconv -f utf-16le -t utf-8" 和我的.git属性: # Custom for MFC *.rc tex

我正试图让git将UTF-16识别为文本,以允许我在本地将其作为文本进行区分和修补,但我在使
textconv
参数正常工作时遇到了问题

我可以手动打电话

iconv -f utf-16 -t utf-8 some-utf-16-file.rc
一切都很好。但是如果我按照如下方式配置我的.gitconfig

[diff "utf16"]
    textconv = "iconv -f utf-16le -t utf-8"
和我的.git属性:

# Custom for MFC
*.rc text eol=crlf diff=utf16
但是,如果运行
git diff
,将显示以下内容:

iconv: C:/Users/Mahmoud/AppData/Local/Temp/IjLBZ8_OemKey.rc:104:1: incomplete character or shift sequence
通过procmon,我可以在创建此流程时跟踪到它:

sh -c "iconv.exe -f utf-16le -t utf-8 \"$@\"" "iconv.exe -f utf-16le -t utf-8" C:/Users/Mahmoud/AppData/Local/Temp/JLOkVa_OemKey.rc
…实际上,我可以很好地运行(不过,在实际文件上)

有什么想法吗


(请注意,我知道让git与UTF-16一起工作的各种解决方案。我特别试图解决这个问题,即为什么iconv本身可以工作,但当git调用它时它将不工作。此外,这个错误最初是在尝试“重复”问题中的一个链接解决方案时遇到的。谢谢大家。)

仅使用
diff
,它应该可以工作:

*.rc diff=utf16

text
eol
导致git在将数据传递给iconv之前替换行尾,之后它不再是有效的utf16,因为。

git最近开始理解编码,实际上,ie在某种程度上是内置的。请参阅文档,搜索
工作树编码

[确保您的手册页匹配,因为这是全新的!]

如果(比如)文件是utf-16,在windows机器上没有bom表,则添加到gitattributes文件中

some-utf-16-file.rc text working-tree-encoding=UTF-16LE eol=CRLF
如果utf-16 little endinan(带bom)开启*nix,则将其激活

some-utf-16-file.rc text working-tree-encoding=UTF-16 eol=LF
Git 2.21(2019年2月)添加了一种新的编码UTF-16LE-BOM:发明该编码是为了使用小尾端字节顺序的BOM对UTF-16进行编码,这不能通过使用
iconv
直接生成

参见(2019年1月30日)作者。
(于2019年2月7日合并)

支持工作树编码“UTF-16LE-BOM” 希望在工作树中使用UTF-16文件的用户将
.gittributes
设置为:

test.txt working-tree-encoding=UTF-16
unicode标准本身定义了3种允许的UTF-16编码方式。 以下3个版本在UTF-8中将全部转换回“g”i“t”:

a) UTF-16, without BOM, big endian:
$ printf "\000g\000i\000t" | iconv -f UTF-16 -t UTF-8 | od -c
0000000    g   i   t

b) UTF-16, with BOM, little endian:
$ printf "\377\376g\000i\000t\000" | iconv -f UTF-16 -t UTF-8 | od -c
0000000    g   i   t

c) UTF-16, with BOM, big endian:
$ printf "\376\377\000g\000i\000t" | iconv -f UTF-16 -t UTF-8 | od -c
0000000    g   i   t
Git使用
libiconv
将索引中的UTF-8转换为索引中的ITF-16 工作树。
签出后,生成的文件有一个BOM表,编码为“UTF-16”, 在上述版本(c)中。
这是iconv生成的,更多详细信息如下

iconv
(和
libiconv
)可以生成UTF-16、UTF-16LE或UTF-16BE:

d) UTF-16
$ printf 'git' | iconv -f UTF-8 -t UTF-16 | od -c
0000000  376 377  \0   g  \0   i  \0   t

e) UTF-16LE
$ printf 'git' | iconv -f UTF-8 -t UTF-16LE | od -c
0000000    g  \0   i  \0   t  \0

f)  UTF-16BE
$ printf 'git' | iconv -f UTF-8 -t UTF-16BE | od -c
0000000   \0   g  \0   i  \0   t
在Git工作树中无法从上面生成版本(b), 但这正是某些应用程序所需要的。
(所有完全支持unicode的应用程序应能够读取所有3种变体, 但实际上,我们还没有做到这一点)

当生成UTF-16作为输出时,
iconv
生成big-endian版本 有BOM表。(选择big endian可能是出于历史原因)

iconv
可以通过使用“UTF-16LE”以较小的长度生成UTF-16文件 作为编码,并且该文件没有BOM表

并非所有用户(尤其是Windows下的用户)都对此感到满意。
有些工具不完全支持unicode,只能处理版本(b)

如今,无法使用
iconv
(或
libiconv
)生成版本(b)。
纵观
iconv
的历史,似乎未来所有
iconv
版本都将使用版本(c)(出于兼容性原因)

解决这个难题,并引入一个特定于Git的“
UTF-16LE-BOM

libiconv无法处理编码,所以Git将其拾取,处理BOM 并使用libiconv转换流的其余部分。(为了保持一致性,增加了UTF-16BE-BOM)


试试这个:,或者这个:@paulsm4我的问题实际上是关于让git和iconv更好地工作,而不是让git与UTF-16一起工作;但是谢谢!对此不确定-这可能与iconv.exe是二进制文件有关吗?记住-从DOS/Windows“命令行”,有一大堆不同的参与者参与其中:包括Cygwin和Windows。请阅读我引用的链接:“GNU diff并不真正关心unicode,所以当您使用diff--text时,它只是区分并输出文本。问题是您使用的终端无法处理发出的UTF-16(与ASCII字符的区分标记结合在一起)。”请阅读多个不同的解决方法。可能是git在将该文件提交给iconv之前重写了行尾字符(这会弄乱utf-16)吗?感谢您解释问题的原因并提供继续使用尝试的方法(但正确)的解决方案。太糟糕了,这不能与interactive/patch
git add
一起使用,但这是不可能的,因为在过滤视图和源材料之间没有保证的一对一映射。感谢此更新!我猜这将与互动补丁添加工作,所以它是非常受欢迎的!