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

nous avons un projet dans Team Foundation Server (TFS) qui a un caractère non-anglais (š). En essayant de script quelques choses liées à la construction, nous sommes tombés sur un problème - nous ne pouvons pas passer la lettre š aux outils en ligne de commande. L'invite de commande ou quoi d'autre pas les dégâts, et la tf.exe utilitaire ne peut pas trouver le projet spécifié.

j'ai essayé différents formats pour le .bat file (ANSI, UTF-8 avec et sans BOM ) ainsi que le script en JavaScript (qui est Unicode par nature) - mais pas de chance. Comment puis-je exécuter un programme et lui transmettre une ligne de commande Unicode ?

264
demandé sur saw303 2008-12-23 12:30:59

17 réponses

mon arrière-plan: J'utilise L'entrée/sortie Unicode dans une console depuis des années (et je le fais souvent tous les jours. En outre, je développe des outils de soutien pour exactement cette tâche). Il y a très peu de problèmes, dans la mesure où vous comprenez les faits/limites suivantes:

  • CMD et "console" sont des facteurs indépendants. CMD.exe est juste l'un des programmes qui sont prêts à travailler "à l'intérieur" d'une console (console d'applications").
  • AFAIK, CMD a un support parfait pour Unicode; vous pouvez entrer/sortir toutes les chars Unicode quand n'importe quel codepage est actif.
  • Windows ' console a beaucoup de soutien pour Unicode - mais il n'est pas parfait (juste "assez bon"; voir ci-dessous).
  • chcp 65001 est très dangereux. À moins qu'un programme n'ait été spécialement conçu pour contourner les défauts du noyau de Windows (ou utilise une bibliothèque d'exécution C qui a ces solutions de contournement), il n'aurait pas fonctionner de manière fiable. Win8 corrige la moitié de ces problèmes avec cp65001 , mais le reste est toujours applicable à Win10 .
  • je travaille dans cp1252 . Comme je l'ai déjà dit: pour l'entrée/sortie Unicode dans une console, on n'a pas besoin de régler la page de code .

les détails

  • pour lire / écrire Unicode sur une console, une application (ou sa bibliothèque d'exécution C) devrait soyez suffisamment intelligent pour utiliser non pas L'API File-I/O , mais L'API Console-I/O . (Pour un exemple, voir comment Python fait-il .)
  • de même, pour lire les arguments en 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 de police de la Console ne prend en charge que les caractères Unicode dans BMP (en d'autres termes: au-dessous de U+10000 ). Seul le rendu de texte simple est pris en charge (donc Les langues européennes - et certaines langues D'Asie de l'est - devraient fonctionner correctement-dans la mesure où on utilise des formes pré-composées). [Il y a un en petits caractères ici pour L'Asie de l'est et pour les caractères U+0000, U+0001, U+30FB.]

considérations pratiques

  • Le par défaut sur la Fenêtre ne sont pas très utiles. Pour une meilleure expérience, il faut mettre au point 3 pièces de configuration:

    • Pour la sortie: un complet de la console de police. Pour de meilleurs résultats, je recommande mes constructions . (Les instructions d'installation y sont présentes - et également listées dans d'autres réponses sur cette page.)
    • Pour l'entrée: un capable de disposition de clavier. Pour de meilleurs résultats, je recommande mes layouts .
    • Pour l'entrée: autoriser l'HEX d'entrée de l'Unicode .
  • un gotcha de plus avec "collage" dans une application de console (très technique):

    • HEX d'entrée offre un caractère sur KeyUp de Alt ; tous d'autres façons de fournir un personnage arrive sur KeyDown ; de sorte que de nombreuses applications ne sont pas prêts à voir un personnage 151990920" . (Applicable uniquement aux applications utilisant L'API Console-I/O .)
    • Conclusion: de nombreuses applications ne réagiraient pas sur les événements d'entrée HEX.
    • de plus, ce qui se passe avec un caractère" collé "dépend de la disposition actuelle du clavier: si le caractère peut être dactylographié sans utiliser de touches de préfixe (mais avec une combinaison compliquée arbitraire de modificateurs, comme dans Ctrl-Alt-AltGr-Kana-Shift-Gray* ) alors il est livré sur une touche émulée. C'est ce que toute application attend - donc coller tout ce qui ne contient que de tels caractères est très bien.
    • cependant, les" autres "caractères sont délivrés par Emulation HEX input .

    Conclusion : à moins que votre disposition de clavier ne supporte l'entrée d'un grand nombre de caractères sans les touches de préfixe, quelques applications buggées peut sauter des caractères lorsque vous Paste via L'UI de la Console: Alt-Space E P . ( Ce est pourquoi je recommande à l'aide de mon clavier mises en page!)

il faut également garder à l'esprit que les "consoles alternatives, ‘plus capables’" pour Windows ne sont pas des consoles du tout . Ils ne supportent pas les API Console-I/O , de sorte que les programmes qui dépendent de ces API pour fonctionner ne fonctionneraient pas. (Les programmes qui utilisent seulement "File-I / O APIs to the console filehandles" fonctionneraient très bien, cependant.)

un exemple de ce type de non-console fait partie du Powershell de MicroSoft . Je ne l'utilise pas; pour expérimenter, presser et publier WinKey , puis tapez powershell .


(d'autre part, il existe des programmes tels que ConEmu ou ANSICON qui tentent d'en faire plus: ils "tentent" d'intercepter Console-I/O API pour faire fonctionner "de vraies applications console". Cela fonctionne certainement pour les programmes d'exemple de jouet; en dans la vraie vie, cela peut ou non résoudre vos problèmes particuliers. Expérience.)

résumé

  • police de caractères, disposition du clavier (et possibilité d'entrée HEX).

  • n'utiliser que des programmes qui passent par Console-I/O API, et accepter les arguments en ligne de commande Unicode. Par exemple, tout programme compilé cygwin devrait être correct. Comme je l'ai déjà dit, CMD est très bien aussi.

UPD: initialement, pour un bug dans cp65001 , Je mélangeais des couches de noyau et de CRTL. aussi: Win8 corrige la moitié de ce bug; j'ai clarifié la section sur l'application" meilleure console", et j'ai ajouté une référence à la façon dont Python le fait.

28
répondu Ilya Zakharevich 2018-09-20 03:49:53

, Essayez:

chcp 65001

qui changera la page de code en UTF-8. De plus, vous devez utiliser les polices de la console Lucida.

351
répondu kgiannakakis 2008-12-23 09:39:44

j'ai eu le même problème (je suis de la République tchèque). J'ai un anglais d'installation de Windows, et je dois travailler avec des fichiers sur un lecteur partagé. Les chemins vers les fichiers comprennent des caractères propres à la République tchèque.

la solution qui fonctionne pour moi est:

dans le fichier batch, changer la page du jeu de caractères

mon fichier de lots:

chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp

le fichier batch doit être sauvegardé dans CP 1250.

Notez que la console n'affichera pas les caractères correctement, mais elle les comprendra...

34
répondu vanna 2017-01-01 23:36:23

vérifier la langue pour les programmes non Unicode. Si vous avez des problèmes avec le russe dans la console Windows, alors vous devez définir le Russe ici:

Changing language for non-Unicode programs

23
répondu Maxim Yefremov 2017-01-01 23:38:44

en fait, le truc est que l'invite de commande comprend ces caractères non-anglais, mais ne peut pas les afficher correctement.

quand j'entre un chemin dans l'invite de commande qui contient des caractères non-anglais, il s'affiche comme "?? ?????? ?????". Lorsque vous soumettez votre commande (cd "??? ?????? ?????"dans mon cas), tout fonctionne comme prévu.

12
répondu User 2009-04-14 13:03:27

il est assez difficile de changer le Codepage par défaut de la console Windows. Lorsque vous recherchez sur le web vous trouvez différentes propositions, cependant certains d'entre eux peuvent casser vos fenêtres entièrement, i.e. votre PC ne démarre plus.

la solution La plus sûre est celle-ci: Allez à la clé de Registre HKEY_CURRENT_USER\Software\Microsoft\Command Processor et ajoutez la valeur de chaîne de caractères Autorun = chcp 65001 .

ou vous pouvez utiliser ce petit lot-Script 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
)

en utilisant @chcp 65001>nul au lieu de chcp 65001 supprime la sortie" page de code actif: 65001 " vous obtiendriez chaque fois que vous démarriez une nouvelle fenêtre de ligne de commande.

une liste complète de tous les numéros disponibles que vous pouvez obtenir à partir de identificateurs de Page de Code

Note, les paramètres ne s'appliquent qu'à l'utilisateur courant. Si vous souhaitez définir pour tous les utilisateurs, remplacer la ligne SET ROOT_KEY="HKEY_CURRENT_USER" par SET ROOT_KEY="HKEY_LOCAL_MACHINE"

11
répondu Wernfried Domscheit 2017-07-24 09:56:07

sur une machine Windows 10 x64, j'ai fait la commande Affichage prompt de caractères non-anglais par:

ouvrir une invite de commande élevée (exécuter CMD.EXE en tant qu'administrateur). Interrogez votre registre pour les polices TrueType disponibles sur la console par:

    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 ゴシック

maintenant nous avons besoin d'ajouter une police TrueType qui supporte les caractères dont vous avez besoin comme Courier New. Nous le faisons en ajoutant des zéros nom de chaîne, donc dans ce cas, le suivant serait "000":

    REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" /v 000 /t REG_SZ /d "Courier New"

Maintenant, nous mettons en œuvre le support UTF-8:

    REG ADD HKCU\Console /v CodePage /t REG_DWORD /d 65001 /f

définit la police par défaut à "Courier New":

    REG ADD HKCU\Console /v FaceName /t REG_SZ /d "Courier New" /f

Réglez la taille de police à 20:

    REG ADD HKCU\Console /v FontSize /t REG_DWORD /d 20 /f

Activer la modification rapide si vous le souhaitez:

    REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f
9
répondu Alon Or 2017-01-01 23:51:24

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 optionnelle qui est très utile.

  1. vous avez besoin d'une police avec support Unicode. Windows est fourni avec la Console Lucida qui peut être sélectionnée par 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 également accès aux couleurs. Notez que vous pouvez également modifier les paramètres pour la commande windows invoquée de certaines façons (p. ex. g, ouvrez ici, Visual Studio) En choisissant Properties à la place.
  2. vous devez définir la page de code à cp65001 , ce qui semble être la tentative de Microsoft d'offrir le support UTF-7 et UTF-8 pour commander prompt. Pour ce faire, lancez chcp 65001 dans l'invite de commande . Une fois réglé, il reste ainsi jusqu'à ce que la fenêtre soit fermée. Vous devrez le refaire chaque fois que vous lancerez cmd.EXE.

Pour une solution plus permanente, se référer à cette réponse sur Super User. En bref, créer une entrée REG_SZ (chaîne de caractères) en utilisant regedit à HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor et l'appeler AutoRun . Changez sa valeur en chcp 65001 . Si vous ne voulez pas voir le message de sortie de la commande, utilisez @chcp 65001>nul à la place.

certains programmes ont de la difficulté à interagir avec cet encodage, MinGW étant un notable qui échoue lors de la compilation avec une erreur absurde message. Néanmoins, cela fonctionne très bien et ne provoque pas de bugs avec la majorité des programmes.

5
répondu Aaron3468 2017-03-20 10:04:20

pour un problème similaire, (mon problème était de montrer les caractères UTF-8 de MySQL sur une invite de commande),

je l'ai résolu comme ceci:

  1. j'ai changé la police de l'invite de commande en Console Lucida. (Cette étape ne doit pas être pertinente pour votre situation. Il ne s'agit que de ce que vous voyez à l'écran et non pas de ce qui est vraiment le personnage).

  2. j'ai changé le codepage en Windows-1253. Vous le faites à l'invite de commande "chcp 1253". Ça a marché pour mon affaire où je voulais voir L'UTF-8.

3
répondu Christoforos 2017-01-01 23:37:50

une option vraiment simple est d'installer un shell Bash Windows comme MinGW et utiliser que:

Enter image description here

il y a une petite courbe d'apprentissage car vous aurez besoin d'utiliser les fonctionnalités de la ligne de commande Unix, mais vous aimerez la puissance de celle-ci et vous pouvez définir le jeu de caractères de la console à UTF-8.

Enter image description here

bien sûr, vous obtenez aussi tous les *nix goodies comme grep, find, less, etc.

3
répondu Steve Barnes 2017-01-01 23:46:10

Ce problème est assez gênant. J'ai habituellement le caractère chinois dans mon nom de fichier et le contenu du 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 sur Windows 10

  1. définit la région pour supporter le caractère non-utf 8.

  2. après cela, la police de la console sera changée en police de cette locale, et cela change aussi l'encodage de la console.

après avoir effectué des étapes précédentes, afin d'afficher le contenu du fichier D'un fichier UTF-8 en utilisant l'outil en ligne de commande

  1. changez la page en utf-8 par chcp 65001
  2. changement à la police qui supporte utf-8, telle que Lucida Console
  3. Utiliser "151930920 de la commande" aperçu du contenu du fichier, ou cat si vous avez installé Ubuntu bash sur Windows 10
  4. veuillez noter qu'après avoir réglé l'encodage de la console sur utf-8, Je ne peux pas taper de caractères chinois dans le cmd en utilisant la méthode D'entrée chinoise.

la solution la plus paresseuse: il suffit d'utiliser un émulateur de console tel que http://cmder.net /

2
répondu code4j 2018-01-16 09:10:59

Une décision rapide .Fichiers bat si votre ordinateur affiche votre chemin/nom de fichier correct lorsque vous le tapez dans DOS-window:

  1. bien reçu.txt [appuyez sur Enter]
  2. , Tapez le chemin/nom de fichier [appuyez sur Enter]
  3. Appuyez sur Ctrl-Z [appuyez sur Enter]

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 paraîtra illisible) et collez-le dans votre .le fichier bat. L'exécution de l' .bat créé de cette façon à DOS-window a travaillé pour moi (Cyrillique, bulgare).

1
répondu S. Hristov 2015-04-09 11:44:17

une meilleure chose plus propre à faire: il suffit d'installer le pack disponible, Gratuit, Microsoft langue japonaise. (D'autres packs de langue orientale, mais j'ai testé la version Japonaise.)

cela vous donne les polices avec les plus grands ensembles de glyphes, les rend le comportement par défaut, change les divers outils de Windows comme cmd, WordPad, etc.

1
répondu Mike Beckerle 2017-01-01 23:39:41

changer la page de code en 1252 me convient. Le problème pour moi est le symbole double doller § est la conversion à un autre symbole par DOS sur Windows Server 2008.

j'ai utilisé CHCP 1252 et un cap devant lui dans mon énoncé BCP ^§.

1
répondu madhav bitra 2017-01-01 23:44:10

je vois plusieurs réponses ici, mais elles ne semblent pas répondre à la question - l'utilisateur veut obtenir L'entrée Unicode de la ligne de commande.

Windows utilise UTF-16 pour encoder dans deux chaînes de octets, donc vous devez obtenir ces derniers à partir de L'OS de votre programme. Il y a deux façons de le faire -

1) Microsoft a une extension qui permet à main de prendre un large tableau de caractères: int wmain (int argc, wchar_t * argv[]); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2) appeler 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

Lire: http://utf8everywhere.org pour des informations détaillées info, en particulier si vous supportez d'autres systèmes d'exploitation.

1
répondu Robert Boehne 2018-08-31 14:53:20

j'ai eu autour d'un problème similaire effaçant les dossiers nommés Unicode en se référant à eux dans le dossier de fournée par leurs noms courts (8 dot 3).

les noms abrégés peuvent être consultés en faisant dir /x . Évidemment, cela ne fonctionne qu'avec les noms de fichiers Unicode qui sont déjà connus.

0
répondu Michael 2017-01-01 23:45:06

à utf-8: chcp 65001

par défaut: chcp 437

-4
répondu pipepipe0071 2016-06-21 15:09:07