Unicode (utf-8) con git-bash


Estoy teniendo algunos problemas para que unicode funcione para git-bash (en Windows 7). He intentado muchas cosas sin éxito. Aunque, no estoy muy seguro de qué es responsable de esto, así que podría estar trabajando en la dirección equivocada.

Realmente parece que esto debería ser posible como la codificación para cmd.exe se puede cambiar a unicode con 'chcp 65001'.

Aquí hay algunas cosas que he probado (además de lo obvio de mirar a través de las opciones de configuración en el GUI).

  1. Estableciendo variables de entorno en '.bashrc". Supongo que tiene sentido que esto no funcione ya que creo que es una cosa de Linux. El comando' locale ' no existe.

    export LC_ALL=en_US.UTF-8
    export LANG=en_US.UTF-8
    export LANGUAGE=en_US.UTF-8
    
  2. Comenzando en cmd.exe, cambiando la codificación a unicode con 'chcp 65001' y luego iniciando git-bash. Esto hace que obtenga un permiso denegado al intentar catear mi archivo de prueba unicode. Sin embargo, catting un archivo sin unicode funciona muy bien. Como se demostró, abandonar de nuevo a cmd.exe todavía puedo " cat " el archivo. Usando mi codificación predeterminada (437) puedo gato el archivo en bash (sin permiso denegado, pero la salida es clara).

    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£
    
  3. Usar la bandera /U al iniciar el shell (tiene sentido que no funcione porque no es para lo que es si-entiendo-correctamente, pero tiene que ver con unicode, así que lo probé).

    C:\Windows\SysWOW64\cmd.exe /U /C "C:\Program Files (x86)\Git\bin\sh.exe" --login -i
    
  4. Como prefiero usar Console2, he intentado agregar un valor dword llamado CodePage con el valor 65001 (decimal) al registro de Windows bajo [HKEY_CURRENT_USER\Console] así como [HKEY_CURRENT_USER\Console\Git Bash]. Esto parece tener el mismo efecto que el ajuste 'chcp 65001' aceptar que es "automático". (http://stackoverflow.com/questions/379240/is-there-a-windows-command-shell-that-will-display-unicode-characters)

  5. JPSOFT's TCC / LE

  6. PowerCMD

  7. Stackoverflow

  8. Duckduckgo

  9. Ixquick / google

Por lo tanto, el método 2 parece viable si ese problema de permiso se puede solucionar. Sin embargo, estoy abierto a casi cualquier solución, aunque prefiero si puedo usar Console2 (debido principalmente a su ingeniosa función de pestaña). Quizás una solución sería configurar un servidor SSH y luego usar Putty / Kitty para conectarse a él, ¡pero eso está mal! ; )

PS. ¿Hay alguna documentación oficial para git-bash?

Author: Hannes, 2012-05-18

5 answers

Me enfrenté al mismo problema en MSYS Git 2.8.0 y resultó que solo necesitaba cambiar la configuración.

$ git --version

git version 2.8.0.windows.1

La configuración predeterminada de la consola Git Bash en mi sistema no mostraba nombres de archivo griegos.

$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'@

La última línea debe mostrar "Τα έγγραφά μου", la traducción griega de "Mis documentos". Para arreglarlo, seguí los siguientes pasos:

  1. Compruebe su configuración regional existente

    $locale
    
    LANG=en
    LC_CTYPE="C"
    LC_NUMERIC="C"
    LC_TIME="C"
    LC_COLLATE="C"
    LC_MONETARY="C"
    LC_MESSAGES="C"
    LC_ALL=
    

    Como se muestra arriba, en mi caso no fue UTF-8

  2. Cambie la configuración regional a una codificación UTF-8. Haga clic en el icono en el lado izquierdo de la barra de título de MINGW, seleccione "Opciones" y en la categoría "Texto" elija "UTF-8" Conjunto de caracteres. También debe elegir una fuente unicode, como la predeterminada "Lucida Console". Mi configuración se ve como sigue: Configuración regional de MinGW

  3. Cambie el idioma de la ventana actual (no es necesario hacer esto en futuras ventanas, ya que se crearán con la configuración de step 2)

     $ LANG='C.UTF-8'
    
  4. El comando ls ahora debería mostrarse correctamente

    AppData/
    'Application Data'@
    Contacts/
    Cookies@
    Desktop/
    Documents/
    Downloads/
    Favorites/
    Links/
    'Local Settings'@
    NTUSER.DAT
    .
    .
    .
    'Τα έγγραφά μου'@
    
 31
Author: nkatsar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-18 11:22:49

Como dijo CharlesB en un comentario, msysgit 1.7.10 maneja unicode correctamente. Todavía hay algunos problemas, pero puedo confirmar que la actualización resolvió el problema que estaba teniendo.

Véase: https://github.com/msysgit/msysgit/wiki/Git-for-Windows-Unicode-Support

 7
Author: Hannes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-18 15:58:30

Compruebe si el problema persiste con Git 2.1 (agosto de 2014).
Véase commit 617ce96 o commit 1c950a5 por Karsten Blees (kblees)

Win32: soporte de salida de consola Unicode

WriteConsoleW parece ser la única manera de imprimir unicode de forma fiable a la consola (sin conversiones de páginas de código extrañas).

También redirige vfprintf a la versión winansi.c.

Win32: agregar funciones de conversión Unicode

Añadir Unicode funciones de conversión para convertir entre la codificación nativa UTF-16LE de Windows a UTF-8 y viceversa.

Para admitir repositorios con nombres de archivo codificados heredados, la función de conversión de UTF-8 a UTF-16 intenta crear nombres de archivo válidos y únicos incluso para secuencias de bytes UTF-8 no válidas, de modo que estos repositorios se puedan extraer sin error.

Es probable que sea un port de algo ya integrado en msysgit, pero al menos eso significa que la versión de Windows de Git no tendrá que diverge / patch del código fuente principal de Git repo para incluir esas mejoras.

 5
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-02 19:27:58

Puedo ver que hay algunos problemas con la codificación de caracteres con git bash para windows. Menos por el trabajo con el propio git y las herramientas con las que se incluye (curl, cat, grep, etc.). No me encontré con problemas con estos a lo largo de los años relacionados con la codificación de caracteres.

Normalmente con cada nueva versión los problemas se resuelven mejor. Por ejemplo, con la versión de hace un año, no podía introducir caracteres como "ä " en el shell, por lo que no era posible escribir

echo "ä"

Para rápidamente prueba si UTF-8 es compatible y en qué nivel. Una solución es escribir las secuencias octales de bytes:

$ echo -e "\0303\0244"
ä

Todavía tengo problemas cuando ejecuto mi php de Windows.exe binario para texto de salida:

$ php -r 'echo "\xC3\xA4";'
ä

Esto no da el "ä" en el terminal, sino que produce "├ñ" en su lugar. La solución que tengo para eso es, que envuelva el comando php en un bash-script que procesa la salida a través de cat:

#!/bin/bash

{ php.exe "$@" 2>&1 1>&3 | cat 1>&2; } 3>&1 | cat

ref. reg. stdout + stderr cat

Esto mágicamente hace que php vuelva a funcionar:

$ php -r 'echo "\xC3\xA4";'
ä

Se aplica a

$ git --version
git version 1.9.4.msysgit.1

Debo admitir que echo de menos una comprensión más profunda de por qué esto es todo lo que es. Pero finalmente estoy feliz de haber encontrado una solución para usar php en git bash con soporte UTF-8.

 3
Author: hakre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:36:27

Encontré esta respuesta en otro lugar:

chcp.com 65001

Git bash chcp windows7 problema de codificación

Eso es lo que realmente lo resolvió para mí.

 1
Author: TravisChambers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-22 21:08:27