J'ai du mal à faire fonctionner unicode pour git-bash (sous Windows 7). J'ai essayé beaucoup de choses sans succès. Bien que je ne sois pas tout à fait responsable de cela, je peux donc travailler dans la mauvaise direction.
Il semble vraiment que cela devrait être possible car l'encodage de cmd.exe peut être changé en unicode avec 'chcp 65001'.
Voici quelques choses que j'ai essayées (en plus de l'évidence de regarder à travers les options de configuration dans l'interface graphique).
Définition des variables d'environnement dans '.bashrc'. Je suppose qu'il est logique que cela ne fonctionne pas car je pense que c'est une chose Linux. La commande "locale" n'existe pas.
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
Commencer dans cmd.exe, changer l'encodage en unicode avec 'chcp 65001' puis lancer git-bash. Cela m'oblige à refuser une autorisation lorsque j'essaie de capturer mon fichier de test Unicode. Cependant, la capture d'un fichier sans unicode fonctionne très bien. Comme démontré, en redescendant vers cmd.exe, je peux toujours "cat" le fichier. En utilisant mon encodage par défaut (437), je peux attraper le fichier en bash (aucune autorisation refusée mais la sortie est truquée).
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£
Utiliser l'indicateur/U lors du démarrage du shell (il est logique que cela ne fonctionne pas parce que ce n'est pas tout à fait ce que c'est si-je-comprends-correctement, mais cela a à voir avec l'unicode, donc je l'ai essayé).
C:\Windows\SysWOW64\cmd.exe /U /C "C:\Program Files (x86)\Git\bin\sh.exe" --login -i
Comme je préfère utiliser Console2, j'ai essayé d'ajouter une valeur dword nommée CodePage avec la valeur 65001 (décimal) au registre Windows sous [HKEY_CURRENT_USER\Console] ainsi que [HKEY_CURRENT_USER\Console\Git Bash]. Cela semble avoir le même effet que le réglage 'chcp 65001' accepte qu'il soit "automatique". (http://stackoverflow.com/questions/379240/is-there-a-windows-command-Shell-that-will-display-unicode-characters)
TCC/LE de JPSoft
PowerCMD
stackoverflow
duckduckgo
ixquick/google
Ainsi, la méthode 2 semble viable si ce problème d'autorisation peut être résolu. Cependant, je suis ouvert à presque toutes les solutions, même si je préfère utiliser Console2 (principalement en raison de sa fonctionnalité d'onglets astucieuse). Une solution serait peut-être de configurer un serveur SSH puis d'utiliser PuTTY/Kitty pour s'y connecter, mais c'est tout simplement faux! ; )
PS. Existe-t-il une documentation officielle pour git-bash?
Comme CharlesB l'a dit dans un commentaire, msysgit 1.7.10 gère correctement l'unicode. Il y a encore quelques problèmes mais je peux confirmer que la mise à jour a résolu le problème que j'avais.
Voir: https://github.com/msysgit/msysgit/wiki/Git-for-Windows-Unicode-Support
J'ai rencontré le même problème dans MSYS Git 2.8.0 et il s'est avéré qu'il suffisait de modifier la configuration.
$ git --version
git version 2.8.0.windows.1
La configuration par défaut de la console Git Bash dans mon système n'affichait pas les noms de fichiers grecs.
$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 dernière ligne devrait afficher "Τα έγγραφά μου", la traduction grecque de "Mes documents". Afin de le réparer, j'ai suivi les étapes ci-dessous:
Vérifiez votre configuration locale existante
$locale
LANG=en
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=
Comme indiqué ci-dessus, dans mon cas, ce n'était pas UTF-8
Modifiez les paramètres régionaux en un codage UTF-8. Cliquez sur l'icône sur le côté gauche de la barre de titre MINGW, sélectionnez "Options" et dans la catégorie "Texte" choisissez le jeu de caractères "UTF-8". Vous devez également choisir une police unicode, comme la "Lucida Console" par défaut. Ma configuration se présente comme suit:
Changer la langue de la fenêtre actuelle (pas besoin de le faire sur les futures fenêtres, car elles seront créées avec les paramètres de l'étape 2)
$ LANG='C.UTF-8'
La commande ls devrait maintenant s'afficher correctement
AppData/
'Application Data'@
Contacts/
Cookies@
Desktop/
Documents/
Downloads/
Favorites/
Links/
'Local Settings'@
NTUSER.DAT
.
.
.
'Τα έγγραφά μου'@
Vérifiez si le problème persiste avec Git 2.1 (août 2014).
Voir commit 617ce96 ou commit 1c950a5 par Karsten Blees (kblees
)
WriteConsoleW
semble être le seul moyen d'imprimer de manière fiable unicode sur la console (sans conversions de page de code étranges).Redirige également
vfprintf
verswinansi.c
version.
Ajoutez des fonctions de conversion Unicode pour convertir entre le codage UTF-16LE natif de Windows en UTF-8 et inversement.
Pour prendre en charge les référentiels avec des noms de fichiers encodés hérités, la fonction de conversion UTF-8 vers UTF-16 essaie de créer des noms de fichiers uniques et valides même pour des séquences d'octets UTF-8 invalides, afin que ces référentiels puissent être extraits sans erreur.
Il est probable qu'il s'agisse d'un portage de quelque chose déjà intégré dans msysgit, mais au moins cela signifie que la version Windows de Git n'aura pas à diverger/patcher du code source principal du dépôt Git pour inclure ces améliorations.
Je peux voir qu'il y a des problèmes avec l'encodage de caractères avec git bash pour Windows. Moins pour le travail avec git lui-même et les outils avec lesquels il est livré (curl, cat, grep etc.). Je n'ai pas rencontré de problèmes avec ceux-ci au fil des ans liés à l'encodage des caractères.
Normalement, à chaque nouvelle version, les problèmes sont mieux résolus. Par exemple. avec la version d'il y a un an, je ne pouvais pas entrer de caractères comme "ä
"dans le Shell, il n'a donc pas été possible d'écrire
echo "ä"
Pour tester rapidement si UTF-8 est pris en charge et à quel niveau. Une solution de contournement consiste à écrire les séquences d'octets octales:
$ echo -e "\0303\0244"
ä
Toujours des problèmes que j'ai quand j'exécute mon binaire windows php.exe pour sortir du texte:
$ php -r 'echo "\xC3\xA4";'
ä
Cela ne donne pas le "ä
"dans le terminal, mais il génère" ├ñ
"à la place. La solution de contournement que j'ai pour cela est que j'encapsule la commande php
dans un script bash qui traite la sortie via cat
:
#!/bin/bash
{ php.exe "$@" 2>&1 1>&3 | cat 1>&2; } 3>&1 | cat
Comme par magie, php
fonctionne à nouveau:
$ php -r 'echo "\xC3\xA4";'
ä
S'applique à
$ git --version
git version 1.9.4.msysgit.1
Je dois admettre que je ne comprends pas mieux pourquoi c'est ainsi. Mais je suis finalement heureux d'avoir trouvé une solution de contournement pour utiliser php dans git bash avec le support UTF-8.
Trouvé cette réponse ailleurs:
chcp.com 65001
Git bash chcp windows7 encoding issue
C'est ce qui l'a réellement résolu pour moi.
Le problème avec chcp 65001 est qu'il y a des bogues dans le runtime C (MSVCRT) qui font que les appels stdio retournent des résultats incohérents lorsqu'ils sont exécutés sous la page de codes 65001.
Cela devrait être mieux avec Git 2.23 (Q3 2019)
Voir commit 090d1e8 (03 juil.2019) par Karsten Blees (kblees
) .
(Fusionné par Junio C Hamano - gitster
- in commit 0328db , 11 juillet 2019)
gettext: utilisez toujours UTF-8 sur Windows natif
Sur Windows natif, Git utilise exclusivement UTF-8 pour la sortie de la console (à la fois avec MinTTY et la console Win32 native).
Gettext utilise
setlocale()
pour déterminer l'encodage de sortie du texte traduit, cependant,setlocale()
de MSVCRT ne prend pas en charge UTF-8. Par conséquent, le texte traduit est codé dans le codage système (selonGetAPC()
) et les caractères non ASCII sont modifiés dans la sortie de la console .Note latérale: Il existe en fait une page de codes pour UTF-8: 65001.
En pratique, cela ne fonctionne pas comme prévu au moins sur Windows 7, donc nous ne pouvons pas l'utiliser dans Git. En outre, si nous avons outrepassé la page de codes, tout processus généré à partir de Git hériterait de cette page de codes (par opposition à la page de codes configurée pour l'utilisateur actuel), ce qui pourrait très probablement se briser, par exemple diff ou fusionner des aides. Nous ne pouvons donc vraiment pas remplacer la page de codes.Dans
init_gettext_charset()
, Git appellebind_textdomain_codeset()
de gettext avec le jeu de caractères obtenu vialocale_charset()
; Remplaçons cette dernière fonction pour forcer le codage en UTF-8 sur Windows natif.Dans le SDK de Git pour Windows, il y a un
libcharset.h
Et donc nous définissonsHAVE_LIBCHARSET_H
Dans la section spécifique à MINGW dansconfig.mak.uname
, Donc nous devons ajouter la substitution avant cela conditionnellement -bloc de code compilé.Plutôt que de simplement définir
locale_charset()
pour renvoyer la chaîne"UTF-8"
, Nous veillons toutefois à ne pas casserLC_ALL=C
: La série de correctifsab/no-kwset
, Par exemple, doit avoir un moyen d'empêcher Git de s'attendre à une entrée encodée en UTF-8.
Et:
Voir commit 697bdd2 (04 juil.2019), et commit 9423885 , commit 39a98e9 (27 juin 2019) par Johannes Schindelin (dscho
) .
(Fusionné par Junio C Hamano - gitster
- in commit 0a2ff7c , 11 juillet 2019)
mingw
: utiliser explicitement les fonctions UnicodeDe nombreuses fonctions de l'API Win32 existent en fait en deux variantes: une avec le suffixe
A
qui prend les paramètres ANSI (char *
Ouconst char *
) Et une avec le suffixeW
qui accepte les paramètres Unicode (wchar_t *
ouconst wchar_t *
).La variante ANSI suppose que les chaînes sont codées en fonction des paramètres régionaux actuels.
Ce n'est pas ce que Git veut utiliser sous Windows: nous supposons que les variableschar *
Pointent vers des chaînes encodées en UTF-8.Il existe une pseudo locale UTF-8 sous Windows, mais cela ne fonctionne pas comme on pourrait s'y attendre. De plus, si nous surpassions les paramètres régionaux de l'utilisateur, cela modifierait le comportement des programmes générés par Git (tels que les éditeurs, les outils diff, etc.), nous ne pouvons donc pas utiliser ce pseudo-paramètre régional.
De plus, il est en fait fortement encouragé d'utiliser les versions Unicode au lieu des versions ANSI, alors faisons exactement cela.
Remarque: lors de l'appel des fonctions de l'API Win32 sans tout suffixe, cela dépend si la constante
UNICODE
est définie avant que les en-têtes appropriés soient # inclus.
Sans cette constante, les variantes ANSI sont utilisées.
Soyons explicites et évitons cette ambiguïté.