web-dev-qa-db-fra.com

Comment utiliser des caractères unicode dans la ligne de commande Windows?

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 ?

297
Vilx-

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”).
  • Autant que je sache, CMD supporte parfaitement Unicode; vous pouvez entrer/sortir tous les caractères Unicode quand une page de code est active.
  • La console Windows supporte BEAUCOUP l’Unicode, mais il n’est pas parfait (juste “assez bon”; voir ci-dessous).
  • 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 .
  • Je travaille dans 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 .

Les détails

  • Pour lire/écrire Unicode sur une console, une application (ou sa bibliothèque d'exécution C) doit être suffisamment intelligente pour utiliser non pas l'API File-I/O, mais l'API Console-I/O. (Pour un exemple, voir comment Python le fait-il] .)
  • De même, pour lire les arguments de ligne de commande Unicode, une application (ou sa bibliothèque d'exécution C) doit être suffisamment intelligente pour utiliser l'API correspondante.
  • Le rendu des polices en console ne prend en charge que les caractères Unicode dans BMP (autrement dit, sous 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.]

Considérations pratiques

  • 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:

    • Pour la sortie: une police de console complète. Pour de meilleurs résultats, je recommande my builds . (Les instructions d'installation sont présentes ici - et également énumérées dans d'autres réponses sur cette page.)
    • Pour la saisie: une disposition de clavier capable. Pour de meilleurs résultats, je recommande mes mises en page .
    • Pour l'entrée: autorise l'entrée HEX de Unicode .
  • Encore une chose avec “Coller” dans une application console (très technique):

    • L'entrée HEX fournit un caractère sur 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.)
    • Conclusion: de nombreuses applications ne réagiraient pas aux événements d’entrée HEX.
    • De plus, ce qui se passe avec un caractère "collé" dépend de la disposition du clavier actuelle: si le caractère peut être saisi sans utiliser de touches de préfixe (mais avec une combinaison compliquée arbitraire de modificateurs, comme dans 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.
    • Cependant, les "autres" caractères sont fournis par en émulant l'entrée HEX .

    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.)

Sommaire

  • 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.

46
Ilya Zakharevich

Essayer:

chcp 65001

ce qui changera la page de code en UTF-8. En outre, vous devez utiliser les polices de la console Lucida.

372
kgiannakakis

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 ...

36
vanna

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:

Changing language for non-Unicode programs

25
Maxim Yefremov

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"

13

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.

12
User

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
10
Alon Or

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.

  1. Vous avez besoin d'une police avec le support Unicode. Windows est livré avec Lucida Console qui peut être sélectionné en en cliquant avec le bouton droit de la souris sur la barre de titre de l'invite de commande et en cliquant sur l'option 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.
  2. Vous devez définir la page de code sur 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.

5
Aaron3468

Une option très simple consiste à installer un shell bash Windows tel que MinGW et à l'utiliser:

Enter image description here

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.

Enter image description here

Bien sûr, vous obtenez également tous les bonus * nix habituels tels que grep, find, less, etc.

4
Steve Barnes

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 ...

Region Settings

3
zvi

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:

  1. 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).

  2. 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.

3
Christoforos

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

  1. Définissez la région pour prendre en charge le caractère non-utf 8.

  2. 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

  1. Changez la page en utf-8 en chcp 65001
  2. Passez à la police qui prend en charge utf-8, telle que Lucida Console
  3. Utilisez la commande type pour afficher le contenu du fichier, ou cat si vous avez installé Ubuntu bash sous Windows 10.
  4. Veuillez noter que, après avoir défini le codage de la console sur utf-8, je ne peux pas taper de caractères chinois dans la cmd à l'aide de la méthode de saisie en chinois.

La solution la plus paresseuse: utilisez simplement un émulateur de console tel que http://cmder.net/

2
code4j

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.

1
Mike Beckerle

À 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.
1
VonC

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 ^ §.

1
madhav bitra

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:

  1. copie avec temp.txt [appuyez sur Entrée]
  2. Tapez le chemin/nom du fichier [appuyez sur Entrée]
  3. Appuyez sur Ctrl-Z [appuyez sur Entrée]

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).

1
S. Hristov

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.

1
Robert Boehne

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.

0
Michael