如何使git/java在ISO-8859-1 Linux系统上正确处理UTF-8文件名?
我有一个存储库,其中几个文件已从Windows签入,文件名中有unicode字符。例如AgêBean.java、GêBean.java、Lêgbean.java和XêviosoBean.java。 在CentOS 7系统上签出这些文件时,组成文件名的字节将被解释为ISO-8859-1。这破坏了java编译器之类的东西。例如,Java不会编译上述文件,因为类的unicode标识符,即“AgêBean”,与ISO-8859-1文件名不匹配,编译器将其视为“AgêBean.Java” 短而难看的解决方法是重命名文件,但是如果它们被签入,那么同样的问题也会出现在Windows端 那么有什么更好的解决方案呢?我可以想象一些,但我不知道如何去做,谷歌也没有帮助: A) 重新配置我的CentOS文件系统,以便所有文件名都采用UTF-8(或UTF-16)编码 B) 在Linux上配置git以了解存储库中的文件名编码为UTF-8,但本地系统是ISO-8859-1,因此在签入或签出时需要转换所有文件名 C) 在Linux上配置java(以及终端和编辑器),以了解此目录下的文件名是UTF-8编码的,因此每个文件名都被正确解码如何使git/java在ISO-8859-1 Linux系统上正确处理UTF-8文件名?,linux,git,encoding,utf-8,filenames,Linux,Git,Encoding,Utf 8,Filenames,我有一个存储库,其中几个文件已从Windows签入,文件名中有unicode字符。例如AgêBean.java、GêBean.java、Lêgbean.java和XêviosoBean.java。 在CentOS 7系统上签出这些文件时,组成文件名的字节将被解释为ISO-8859-1。这破坏了java编译器之类的东西。例如,Java不会编译上述文件,因为类的unicode标识符,即“AgêBean”,与ISO-8859-1文件名不匹配,编译器将其视为“AgêBean.Java” 短而难看的解决
我对解决方案“A”最满意,但到目前为止我还没有找到如何做到这一点。我希望它不会被编译到Cent0s7(或RHEL8)内核中。顺便说一句,我的linux系统上的命令
locale charmap
返回“ISO-8859-1”,我正在寻找一种方法,通过/etc下的设置来改变它,但我不相信这是一种有效的方法。你的结论也是这样的
那是什么文件系统?为什么“文件系统”关心文件名编码?文件系统只关心以零结尾的字符串,内核不关心unicode。我会责怪:当这些文件被签出时
我会责怪“签出”部分。你怎么结账?像导出LC\u ALL=C然后签出这样的东西怎么样我正在寻找一种方法,通过/etc下的设置来改变这一点,
请参见/etc/locale.conf
。请参见(由于您发现的原因,答案是“否”)。同时:Linux已经假设并使用UTF-8(在系统调用接口)。不过,它不会尝试对字节字符串进行编码和解码,除非它确实必须这样做,例如在处理NTFS卷时。您看到的问题是,文件中的数据也有编码;Git在默认情况下从不涉及这些内容,尽管Git现在有一个工作树编码属性(q.v.)。我编辑了我的bash配置文件,到目前为止,添加了导出export LANG=en_US.UTF-8
和export LANGUAGE=“en_US.UTF-8”
似乎正在工作。编译器不再抱怨,但我没有尝试用UTF-8编码重新检查名称。我怀疑(但尚未证明)当LANG=en_US.UTF-8时,大多数应用程序都能正确解码ISO-8858-1。