使用git-bash的Unicode(utf-8)

Han*_*nes 40 windows unicode bash utf-8 git-bash

我在使用unicode为git-bash工作时遇到了一些麻烦(在Windows 7上).我尝试过许多事情都没有成功.虽然,我不太确定对此有什么责任,所以我可能在错误的方向上工作.

看来这应该是可行的,因为可以使用'chcp 65001'将cmd.exe的编码更改为unicode.

以下是我尝试过的一些事情(除了明显的浏览GUI中的配置选项).

  1. 在'.bashrc'中设置环境变量.我想这是行不通的,因为我觉得这是一个linux的事情.'locale'命令不存在.

    export LC_ALL=en_US.UTF-8
    export LANG=en_US.UTF-8
    export LANGUAGE=en_US.UTF-8
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从cmd.exe开始,使用'chcp 65001'将编码更改为unicode,然后启动git-bash.这会导致我在尝试捕获我的unicode测试文件时获得权限被拒绝.但是,在没有unicode的情况下捕获文件就可以了.如所示,退回到cmd.exe我仍然可以"捕获"该文件.使用我的默认编码(437)我可以用bash捕获文件(没有权限被拒绝但输出被捏造).

    S:\>chcp 65001
    Active code page: 65001
    S:\>"C:\Program Files (x86)\Git\bin\sh.exe" --login -i
    zarac@TOWELIE /z
    cat /s/unicode.txt
    cat: write error: Permission denied
    zarac@TOWELIE /z
    cat /s/nounicode.txt
    abc
    zarac@TOWELIE /z
    L /s/unicode.txt
    -rw-r--r--    1 zarac    Administ        7 May 18 10:30 /s/unicode.txt
    zarac@TOWELIE /z
    whoami
    towelie\zarac
    zarac@TOWELIE /z
    exit
    Z:\>type S:\unicode.txt
    abc£
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在启动shell时使用/ U标志(有道理它不起作用,因为它不是正确的,如果我理解正确,但它与unicode有关,所以我尝试了它).

    C:\Windows\SysWOW64\cmd.exe /U /C "C:\Program Files (x86)\Git\bin\sh.exe" --login -i
    
    Run Code Online (Sandbox Code Playgroud)
  4. 由于我更喜欢​​使用Console2,我尝试将名为CodePage的值为65001(十进制)的双字值添加到[HKEY_CURRENT_USER\Console]下的Windows注册表以及[HKEY_CURRENT_USER\Console\Git Bash].这似乎与设置'chcp 65001'接受它是"自动"的效果相同.(http://stackoverflow.com/questions/379240/is-there-a-windows-command-shell-that-will-display-unicode-characters)

  5. JPSoft的TCC/LE

  6. PowerCMD

  7. 堆栈溢出

  8. duckduckgo

  9. ixquick /谷歌

因此,如果可以修复权限问题,方法2似乎是可行的.但是,我对任何解决方案都很开放,但我更喜欢我可以使用Console2(主要是因为它的漂亮标签功能).也许一个解决方案是设置SSH服务器,然后使用Putty/Kitty连接到它,但这是错的!; )

PS.有没有关于git-bash的官方文档?

nka*_*sar 36

我在MSYS Git 2.8.0中遇到了同样的问题,结果发现只需更改配置.

$ git --version

git version 2.8.0.windows.1
Run Code Online (Sandbox Code Playgroud)

我系统中Git Bash控制台的默认配置没有显示希腊文件名.

$cd ~

$ls

AppData/
'Application Data'@
Contacts/
Cookies@
Desktop/
Documents/
Downloads/
Favorites/
Links/
'Local Settings'@
NTUSER.DAT
.
.
.
''$'\316\244\316\261'' '$'\316\255\316\263\316\263\317\201\316\261\317\206\316\254'' '$'\316\274\316\277\317\205'@
Run Code Online (Sandbox Code Playgroud)

最后一行应显示"Ταέγγραφάμου",即"我的文档"的希腊语翻译.为了解决这个问题,我按照以下步骤操作:

  1. 检查现有的区域设置配置

    $locale
    
    LANG=en
    LC_CTYPE="C"
    LC_NUMERIC="C"
    LC_TIME="C"
    LC_COLLATE="C"
    LC_MONETARY="C"
    LC_MESSAGES="C"
    LC_ALL=
    
    Run Code Online (Sandbox Code Playgroud)

    如上所示,在我的情况下,它不是UTF-8

  2. 将语言环境更改为UTF-8编码.单击MINGW标题栏左侧的图标,选择"选项",然后在"文本"类别中选择"UTF-8"字符集.您还应该选择unicode字体,例如默认的"Lucida Console".我的配置如下: MinGW语言环境配置

  3. 更改当前窗口的语言(不需要在将来的窗口中执行此操作,因为它们将使用步骤2的设置创建)

     $ LANG='C.UTF-8'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在应该正确显示ls命令

    AppData/
    'Application Data'@
    Contacts/
    Cookies@
    Desktop/
    Documents/
    Downloads/
    Favorites/
    Links/
    'Local Settings'@
    NTUSER.DAT
    .
    .
    .
    '?? ??????? ???'@
    
    Run Code Online (Sandbox Code Playgroud)

  • 您是真正回答这个问题的nly人。 (2认同)

Tra*_*ers 17

在别处找到了这个答案:

chcp.com 65001

Git bash chcp windows7 编码问题

这就是真正为我解决的问题。


Han*_*nes 7

正如CharlesB在评论中所说,msysgit 1.7.10正确处理unicode.还有一些问题,但我可以确认更新确实解决了我遇到的问题.

请参阅:https://github.com/msysgit/msysgit/wiki/Git-for-Windows-Unicode-Support


Von*_*onC 5

检查Git 2.1(2014年8月)是否仍然存在问题.
提交617ce96承诺1c950a5卡斯滕Blees( kblees)

Win32:支持Unicode控制台输出

WriteConsoleW 似乎是将unicode可靠地打印到控制台的唯一方法(没有奇怪的代码页转换).

也重定向vfprintfwinansi.c版本.

Win32:添加Unicode转换函数

添加Unicode转换函数以将Windows本机UTF-16LE编码转换为UTF-8并返回.

为了支持具有遗留编码文件名的存储库,UTF-8到UTF-16转换函数尝试创建有效的唯一文件名,即使对于无效的UTF-8字节序列也是如此,以便可以无错误地检出这些存储库.

它很可能是已经集成在msysgit中的东西的端口,但至少这意味着Windows版本的Git不必为了包含这些改进而从主要的Git repo源代码中分离/补丁.


hak*_*kre 5

我可以看到使用 git bash for windows 进行字符编码存在一些问题。较少使用 git 本身及其附带的工具(curl、cat、grep 等)。多年来,我没有遇到与字符编码相关的问题。

通常每个新版本问题都会得到更好的解决。例如,使用一年前的版本,我无法ä在 shell 中输入诸如“ ”之类的字符,因此无法编写

echo "ä"
Run Code Online (Sandbox Code Playgroud)

快速测试是否支持 UTF-8 以及在哪个级别。一种解决方法是编写字节序列八进制:

$ echo -e "\0303\0244"
ä
Run Code Online (Sandbox Code Playgroud)

当我执行我的 windows php.exe 二进制文件以输出文本时,我仍然有问题:

$ php -r 'echo "\xC3\xA4";'
ä
Run Code Online (Sandbox Code Playgroud)

这不会ä在终端中给出“ ”,而是输出“ ”。我对此的解决方法是,我将php命令包装在一个 bash 脚本中,该脚本通过cat以下方式处理输出:

#!/bin/bash

{ php.exe "$@" 2>&1 1>&3 | cat 1>&2; } 3>&1 | cat
Run Code Online (Sandbox Code Playgroud)

参考 注册。标准输出 + 标准错误猫

这神奇地然后php再次工作:

$ php -r 'echo "\xC3\xA4";'
ä
Run Code Online (Sandbox Code Playgroud)

适用于

$ git --version
git version 1.9.4.msysgit.1
Run Code Online (Sandbox Code Playgroud)

我必须承认我错过了更深入的理解为什么会这样。但我终于很高兴我找到了一种在 git bash 中使用 php 并支持 UTF-8 的解决方法。