Nous avons un projet dans Team Foundation Server (TFS) qui comporte un caractère non anglais (š). En essayant de scripter quelques problèmes liés à la construction, nous sommes tombés sur un problème. Nous ne pouvons pas transmettre la lettre š aux outils en ligne de commande. . La commande Invite ou quoi d'autre ne le dérange pas et l'utilitaire tf.exe ne peut pas trouver le projet spécifié.
J'ai essayé différents formats pour le fichier .bat (ANSI, UTF-8 avec et sans BOM ), ainsi que le script en JavaScript (qui est Unicode par nature) - mais sans succès. Comment exécuter un programme et lui passer une ligne de commande Unicode ?
Mon parcours: J'utilise l'entrée/la sortie Unicode dans une console depuis des années (et le fais beaucoup de fois par jour. En outre, je développe des outils de support pour cette tâche.) Il y a très peu de problèmes, pour autant que vous compreniez les faits/limitations suivants:
CMD
et "console" sont des facteurs non liés. CMD.exe
est l'un des programmes prêts à “fonctionner à l'intérieur” d'une console (“applications de la console”).CMD
supporte parfaitement Unicode; vous pouvez entrer/sortir tous les caractères Unicode quand une page de code est active.chcp 65001
est très dangereux. À moins qu’un programme ait été spécialement conçu pour contourner les défauts de l’API de Windows (ou qu’il utilise une bibliothèque d’exécution C comportant ces solutions de contournement), il ne fonctionnerait pas de manière fiable. Win8 corrige la moitié de ces problèmes avec cp65001
, mais le reste est toujours applicable à Win1 .cp1252
. Comme je l'ai déjà dit: Pour entrer/sortir en Unicode dans une console, il n'est pas nécessaire de définir la page de codes .File-I/O
, mais l'API Console-I/O
. (Pour un exemple, voir comment Python le fait-il] .)U+10000
). Seul le rendu de texte simple est pris en charge (les langues européennes - et certaines langues d’Asie de l’Est - devraient donc fonctionner correctement - dans la mesure où elles utilisent des formulaires précomposés). [Il existe un tirage mineur mineur ici pour l'Asie de l'Est et pour les caractères U + 0000, U + 0001, U + 30FB.]Les valeurs par défaut de Window ne sont pas très utiles. Pour une meilleure expérience, il convient d’accorder 3 éléments de configuration:
Encore une chose avec “Coller” dans une application console (très technique):
KeyUp
sur Alt
; tous les autres manières de livrer un personnage se produisent sur KeyDown
; tant d'applications ne sont pas prêtes à voir un caractère sur KeyUp
. (Applicable uniquement aux applications utilisant Console-I/O
API.)Ctrl-Alt-AltGr-Kana-Shift-Gray*
), il est remis au choix. touche émulée. C’est ce à quoi toute application s’attend - il est donc correct de coller tout ce qui ne contient que de tels caractères. Conclusion : à moins que votre clavier ne prenne en charge la saisie de BEAUCOUP de caractères sans touches de préfixe, Certaines applications boguées peuvent ignorer des caractères lorsque vous Paste
via l'interface utilisateur de la console: Alt-Space E P
. ( Ceci est la raison pour laquelle je recommande d'utiliser les dispositions de mon clavier!)
Il faut également garder à l’esprit que les "consoles" alternatives, ‘plus puissantes" "pour Windows ne sont pas du tout des consoles . Ils ne prennent pas en charge les API Console-I/O
, de sorte que les programmes dont le fonctionnement dépend de ces API ne fonctionneraient pas. (Les programmes qui utilisent uniquement les "API de fichier-I/O pour les descripteurs de fichiers de la console" fonctionneraient bien, cependant.)
Un exemple de cette non-console est une partie de Powershell
de Microsoft. Je ne l'utilise pas; pour expérimenter, appuyez et relâchez WinKey
, puis tapez powershell
.
(Par contre, il existe des programmes tels que ConEmu
ou ANSICON
qui essaient de faire plus: ils "tentent" d'intercepter Console-I/O
API pour rendre "true applications de console "fonctionnent aussi. Cela fonctionne certainement pour les programmes d'exemple de jouets; dans la vraie vie, cela peut résoudre ou non vos problèmes particuliers. Expérimentez.)
définir la police, la disposition du clavier (et éventuellement, autoriser la saisie HEX).
utilisez uniquement des programmes qui passent par Console-I/O
API et acceptent les arguments de ligne de commande Unicode. Par exemple, tout programme cygwin
- compilé devrait convenir. Comme je l’ai déjà dit, CMD
convient également.
UPD: Initialement, pour un bug dans cp65001
, je mélangeais les couches de noyau et de CRTL ( UPD²: et API en mode utilisateur Windows!). Aussi: Win8 corrige la moitié de ce bogue; J'ai clarifié la section sur l'application "Meilleure console" et ajouté une référence à la façon dont Python le fait.
Essayer:
chcp 65001
ce qui changera la page de code en UTF-8. En outre, vous devez utiliser les polices de la console Lucida.
J'ai eu le même problème (je suis de la République tchèque). J'ai une installation anglaise de Windows et je dois travailler avec des fichiers sur un lecteur partagé. Les chemins d'accès aux fichiers incluent des caractères spécifiques au tchèque.
La solution qui fonctionne pour moi est la suivante:
Dans le fichier de commandes, modifiez la page de jeu de caractères.
Mon fichier batch:
chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp
Le fichier de commandes doit être enregistré dans le CP 1250.
Notez que la console ne montrera pas les caractères correctement, mais les comprendra ...
Vérifiez la langue des programmes non Unicode. Si vous rencontrez des problèmes avec le russe dans la console Windows, vous devez le définir ici:
Il est assez difficile de changer la page de code par défaut de la console Windows. Lorsque vous effectuez une recherche sur le Web, vous trouvez différentes propositions. Toutefois, certaines d'entre elles risquent de casser complètement Windows, c’est-à-dire que votre PC ne démarre plus.
La solution la plus sécurisée est celle-ci: Accédez à la clé de registre HKEY_CURRENT_USER\Software\Microsoft\Command Processor
et ajoutez la valeur String Autorun
= chcp 65001
.
Ou vous pouvez utiliser ce petit script de lot pour les pages de code les plus courantes.
@ECHO off
SET ROOT_KEY="HKEY_CURRENT_USER"
FOR /f "skip=2 tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v OEMCP') do set OEMCP=%%i
ECHO System default values:
ECHO.
ECHO ...............................................
ECHO Select Codepage
ECHO ...............................................
ECHO.
ECHO 1 - CP1252
ECHO 2 - UTF-8
ECHO 3 - CP850
ECHO 4 - ISO-8859-1
ECHO 5 - ISO-8859-15
ECHO 6 - US-ASCII
ECHO.
ECHO 9 - Reset to System Default (CP%OEMCP%)
ECHO 0 - EXIT
ECHO.
SET /P CP="Select a Codepage: "
if %CP%==1 (
echo Set default Codepage to CP1252
reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 1252>nul" /f
) else if %CP%==2 (
echo Set default Codepage to UTF-8
reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 65001>nul" /f
) else if %CP%==3 (
echo Set default Codepage to CP850
reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 850>nul" /f
) else if %CP%==4 (
echo Set default Codepage to ISO-8859-1
add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28591>nul" /f
) else if %CP%==5 (
echo Set default Codepage to ISO-8859-15
add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28605>nul" /f
) else if %CP%==6 (
echo Set default Codepage to ASCII
add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 20127>nul" /f
) else if %CP%==9 (
echo Reset Codepage to System Default
reg delete "%ROOT_KEY%\Software\Microsoft\Command Processor" /v AutoRun /f
) else if %CP%==0 (
echo Bye
) else (
echo Invalid choice
pause
)
L'utilisation de @chcp 65001>nul
au lieu de chcp 65001
supprime la sortie "Page de code active: 65001" que vous obtiendrez à chaque fois que vous démarrerez une nouvelle fenêtre de ligne de commande.
Une liste complète de tous les numéros disponibles que vous pouvez obtenir de identifiants de page de code
Notez que les paramètres ne s'appliqueront qu'à l'utilisateur actuel. Si vous souhaitez le définir pour tous les utilisateurs, remplacez la ligne SET ROOT_KEY="HKEY_CURRENT_USER"
par SET ROOT_KEY="HKEY_LOCAL_MACHINE"
En réalité, l'astuce est que la commande Invite comprend réellement ces caractères non anglais, mais ne peut tout simplement pas les afficher correctement.
Lorsque je saisis un chemin dans l'invite de commande contenant des caractères non anglais, il est affiché sous la forme "?? ?????? ?????". Lorsque vous soumettez votre commande (cd "??? ?????? ?????" dans mon cas), tout fonctionne comme prévu.
Sur une machine Windows 10 x64, j'ai fait en sorte que la commande Invite affiche des caractères non anglais en:
Ouvrez une invite de commande avec privilèges (exécutez CMD.EXE en tant qu'administrateur). Interrogez votre registre sur les polices TrueType disponibles sur la console en procédant comme suit:
REG query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont"
Vous verrez une sortie comme:
0 REG_SZ Lucida Console
00 REG_SZ Consolas
936 REG_SZ *新宋体
932 REG_SZ *MS ゴシック
Nous devons maintenant ajouter une police TrueType prenant en charge les caractères dont vous avez besoin, comme Courier New. Pour ce faire, nous ajoutons des zéros au nom de la chaîne. Dans ce cas, le prochain serait "000":
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" /v 000 /t REG_SZ /d "Courier New"
Maintenant, nous implémentons le support UTF-8:
REG ADD HKCU\Console /v CodePage /t REG_DWORD /d 65001 /f
Définissez la police par défaut sur "Courier New":
REG ADD HKCU\Console /v FaceName /t REG_SZ /d "Courier New" /f
Définissez la taille de la police sur 20:
REG ADD HKCU\Console /v FontSize /t REG_DWORD /d 20 /f
Activez l'édition rapide si vous aimez:
REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f
Comme je n'ai pas vu de réponses complètes pour Python 2.7, je vais décrire les deux étapes importantes et une étape facultative très utile.
Defaults
. Cela donne aussi accès aux couleurs. Notez que vous pouvez également modifier les paramètres des fenêtres de commande invoquées de certaines manières (par exemple, ouvrez-le ici, Visual Studio) en choisissant plutôt Properties
.cp65001
, ce qui semble être la tentative de Microsoft d'offrir la prise en charge des formats UTF-7 et UTF-8 à l'invite de commande. Pour ce faire, exécutez chcp 65001
dans l'invite de commande . Une fois défini, il reste ainsi jusqu'à la fermeture de la fenêtre. Vous devrez le refaire chaque fois que vous lancerez cmd.exe.Pour une solution plus permanente, reportez-vous à cette réponse sur Super utilisateur. En bref, créez une entrée REG_SZ
(Chaîne) en utilisant regedit sur HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor
et nommez-la AutoRun
. Changez sa valeur en chcp 65001
. Si vous ne voulez pas voir le message de sortie de la commande, utilisez plutôt @chcp 65001>nul
.
Certains programmes ont du mal à interagir avec cet encodage, MinGW étant un exemple remarquable qui échoue lors de la compilation avec un message d'erreur insensé. Néanmoins, cela fonctionne très bien et ne cause pas de bugs avec la majorité des programmes.
Une option très simple consiste à installer un shell bash Windows tel que MinGW et à l'utiliser:
Il y a un peu de courbe d'apprentissage, car vous aurez besoin d'utiliser la fonctionnalité de ligne de commande Unix, mais vous allez adorer sa puissance et vous pouvez définir le jeu de caractères de la console sur UTF-8.
Bien sûr, vous obtenez également tous les bonus * nix habituels tels que grep, find, less, etc.
J'ai trouvé cette méthode utile dans les nouvelles versions de Windows 10:
Activez cette fonctionnalité: "Bêta: utilisez Unicode UTF-8 pour la prise en charge linguistique internationale"
Panneau de configuration -> Paramètres régionaux -> onglet Administrateur-> Modifier les paramètres régionaux du système ...
Pour un problème similaire (mon problème était d'afficher les caractères UTF-8 de MySQL sur une invite de commande),
Je l'ai résolu comme ça:
J'ai changé la police de commande Invite à Lucida Console. (Cette étape doit être sans importance pour votre situation. Elle ne concerne que ce que vous voyez à l'écran et non ce qui est vraiment le personnage).
J'ai changé la page de codes en Windows-1253. Vous faites cela sur l'invite de commande par "chcp 1253". Cela a fonctionné pour mon cas où je voulais voir UTF-8.
Ce problème est assez énervant. J'ai généralement un caractère chinois dans mon nom de fichier et le contenu de mon fichier. Veuillez noter que j'utilise Windows 10, voici ma solution:
Pour afficher le nom de fichier , tel que dir
ou ls
si vous avez installé Ubuntu bash sous Windows 10
Définissez la région pour prendre en charge le caractère non-utf 8.
Après cela, la police de la console sera remplacée par la police de ces paramètres régionaux, ce qui modifiera également le codage de la console.
Après avoir effectué les étapes précédentes, afin d'afficher le contenu du fichier d'un fichier UTF-8 à l'aide de l'outil de ligne de commande
chcp 65001
type
pour afficher le contenu du fichier, ou cat
si vous avez installé Ubuntu bash sous Windows 10.La solution la plus paresseuse: utilisez simplement un émulateur de console tel que http://cmder.net/
Une meilleure chose à faire: installez simplement le pack linguistique japonais disponible, gratuit et disponible. (Les autres packs de langues orientales fonctionneront aussi, mais j'ai testé le japonais.)
Cela vous donne les polices avec les plus grands ensembles de glyphes, en fait le comportement par défaut, modifie les différents outils Windows tels que cmd, WordPad, etc.
À partir de juin 2019, avec Windows 10, vous n'aurez plus à modifier la page de codes.
Voir " Présentation du terminal Windows " (de Kayla Cinnamon ) et le Microsoft/Terminal .
Grâce à l’utilisation de la police Consolas, le support partiel Unicode sera fourni.
Comme documenté dans Microsoft/Terminal
numéro 387 :
Il existe actuellement 87 887 idéogrammes en Unicode. Vous avez besoin de tous aussi?
Nous avons besoin d’une limite, et les caractères situés au-delà de cette limite doivent être gérés par une fonte de secours/un lien de police/quoi que ce soit.Ce que Consolas devrait couvrir:
- Caractères utilisés comme symboles utilisés par les programmes OSS modernes dans la CLI.
- Ces caractères doivent suivre la conception et les mesures de Consolas et être correctement alignés sur les caractères Consolas existants.
Ce que Consolas NE devrait PAS couvrir:
- Les caractères et la ponctuation des écritures qui, au-delà du latin, du grec et du cyrillique, nécessitent une mise en forme complexe (comme l’arabe).
- Ces caractères doivent être gérés avec un remplacement de police.
Changer la page de code en 1252 fonctionne pour moi. Le problème pour moi est que le symbole double est converti en un autre symbole par DOS sous Windows Server 2008.
J'ai utilisé CHCP 1252 et une casquette avant dans ma déclaration BCP ^ §.
Une décision rapide pour les fichiers .bat si votre ordinateur affiche le nom de chemin/fichier correct lorsque vous le tapez dans la fenêtre DOS:
De cette façon, vous créez un fichier .txt - temp.txt. Ouvrez-le dans le Bloc-notes, copiez le texte (ne vous inquiétez pas, il sera illisible) et collez-le dans votre fichier .bat. L'exécution du fichier .bat ainsi créé dans la fenêtre DOS a fonctionné pour moi (cyrillique, bulgare).
Je vois plusieurs réponses ici, mais elles ne semblent pas répondre à la question - l'utilisateur veut obtenir une entrée Unicode à partir de la ligne de commande.
Windows utilise UTF-16 pour l'encodage en chaînes à deux octets. Vous devez donc les obtenir à partir du système d'exploitation de votre programme. Il y a deux façons de faire ça -
1) Microsoft a une extension qui permet à main de prendre un tableau de caractères larges: int wmain (int argc, wchar_t * argv []); https://msdn.Microsoft.com/en-us/library/6wd819wh.aspx
2) Appelez l’API Windows pour obtenir la version unicode de la ligne de commande wchar_t win_argv = (wchar_t ) CommandLineToArgvW (GetCommandLineW (), & nargs); https://docs.Microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw
Lisez ceci: http://utf8everywhere.org pour des informations détaillées, en particulier si vous utilisez d'autres systèmes d'exploitation.
Je suis parvenu à résoudre un problème similaire en supprimant les fichiers portant le nom Unicode en les référant dans le fichier de traitement par leur nom court (8 points 3).
Les noms abrégés peuvent être visualisés en faisant dir /x
. Évidemment, cela ne fonctionne qu'avec les noms de fichiers Unicode déjà connus.