Question

Nous avons un projet dans Team Foundation Server (TFS) qui contient un caractère non anglais (Š). Lorsque vous essayez de scripter quelques choses liées à la construction que nous avons tombées sur un problème - nous ne pouvons pas passer le š lettre aux outils de ligne de commande. L'invite de commande ou ce qui ne le gâche pas d'autre, et le tf.exe L'utilitaire ne peut pas trouver le projet spécifié.

J'ai essayé différents formats pour le fichier .bat (ANSI, UTF-8 avec et sans Naître) ainsi que le scripter dans JavaScript (qui est Unicode intrinsèquement) - mais pas de chance. Comment exécuter un programme et le transmettre un Unicode ligne de commande?

Était-ce utile?

La solution

Mon arrière-plan: j'utilise une entrée / sortie Unicode dans une console pendant des années (et je le fais beaucoup quotidiennement. De plus, je développe des outils de support pour exactement cette tâche). Il y a très peu de problèmes, dans la mesure où vous comprenez les faits / limitations suivants:

  • CMD et la «console» sont des facteurs sans rapport. CMD.exe est un juste l'un des programmes qui sont prêts à «travailler à l'intérieur» d'une console («applications de console»).
  • AUTANT QUE JE SACHE, CMD a un support parfait pour Unicode; Vous pouvez saisir / sortir tous les caractères Unicode lorsque n'importe quel Le codepage est actif.
  • La console de Windows a beaucoup de support pour Unicode - mais ce n'est pas parfait (juste «assez bon»; voir ci-dessous).
  • chcp 65001 est très dangereux. À moins qu'un programme ne soit spécialement conçu pour contourner les défauts de l'API de Windows (ou utilise une bibliothèque d'exécution C qui a ces solutions de contournement), cela ne fonctionnerait pas de manière fiable. Win8 résout 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 saisir / sortir Unicode dans une console, il n'a pas besoin de définir le codepage.

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 ne pas utiliser File-I/O API, mais Console-I/O API. (Pour un exemple, voir Comment Python 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 de la police de la console ne prend en charge que les caractères Unicode dans BMP (en d'autres termes: ci-dessous U+10000). Seul le rendu de texte simple est pris en charge (donc les langues européennes - et certaines asiatiques - devraient fonctionner correctement - pour autant que l'on utilise des formes précomposées). [Il y a un mineure Ici pour l'Asie de l'Est et pour les caractères U + 0000, U + 0001, U + 30FB.

Considérations pratiques

  • La par défaut sur la fenêtre ne sont pas très utiles. Pour une meilleure expérience, il faut régler 3 pièces de configuration:

    • Pour la sortie: une police console complète. Pour les meilleurs résultats, je recommande mes constructions. (Les instructions d'installation y sont présentes - et également répertoriées dans d'autres réponses sur cette page.)
    • Pour l'entrée: une disposition du clavier capable. Pour les meilleurs résultats, je recommande mes dispositions.
    • Pour la contribution: Autoriser l'entrée hexagonale de l'Unicode.
  • Un gotcha de plus avec «coller» dans une application de console (très technique):

    • L'entrée hexagonale fournit un personnage sur KeyUp de Alt; tout les autres façons de livrer un personnage se produit KeyDown; Tant d'applications ne sont pas prêtes à voir un personnage sur KeyUp. (Uniquement applicable aux applications en utilisant Console-I/O Api.)
    • Conclusion: De nombreuses applications ne réagiraient pas sur les événements d'entrée hexadécimaux.
    • De plus, ce qui se passe avec un caractère «collé» dépend de la disposition actuelle du clavier: si le personnage peut être dactylo Ctrl-Alt-AltGr-Kana-Shift-Gray*) Ensuite, il est livré sur une pression de clés émulée. C'est ce que n'importe quelle application attend - donc coller tout ce qui ne contient que de tels caractères est bien.
    • Cependant, les «autres» personnages sont livrés par émulation d'entrée hexagonale.

    Conclusion: à moins que votre disposition du clavier ne prenne en charge l'entrée de nombreux caractères sans clés de préfixe, Quelques applications de buggy peut sauter des personnages lorsque vous Paste via l'interface utilisateur de la console: Alt-Space E P. (Cette c'est pourquoi je recommande d'utiliser mes dispositions de clavier!)

Il faut également garder à l'esprit que les «consoles alternatives et plus compétentes» pour Windows ne sont pas du tout des consoles. Ils ne soutiennent pas Console-I/O Les API, donc les programmes qui reposent sur ces API au travail ne fonctionneraient pas. (Les programmes qui utilisent uniquement les «API Fichier-I / O sur la console Filehandles» fonctionneraient bien.)

Un exemple d'une telle non-console fait partie de Microsoft Powershell. Je ne l'utilise pas; pour expérimenter, appuyer et libérer WinKey, puis tape powershell.


(D'un autre côté, il existe des programmes tels que ConEmu ou ANSICON qui essaient de faire plus: ils «tentent» d'intercepter Console-I/O API pour faire fonctionner les «vraies applications de console». Cela fonctionne définitivement pour des programmes d'exemples de jouets; Dans la vraie vie, cela peut ou non résoudre vos problèmes particuliers. Expérience.)

Sommaire

  • Définissez la police, la disposition du clavier (et éventuellement, autorisez l'entrée hexagonale).

  • Utilisez uniquement des programmes qui passent par Console-I/O API, et acceptez les arguments de ligne de commande Unicode. Par exemple, tout cygwin-La programme compilé devrait être bien. Comme je l'ai déjà dit, CMD c'est bien aussi.

Mise à jour: Initialement, pour un bug dans cp65001, Je mélangeais les couches de noyau et de crtl (Upd²: et API de mode utilisateur Windows!). Aussi: Win8 corrige la moitié de ce bug; J'ai clarifié la section sur l'application «meilleure console» et ajouté une référence à la façon dont Python le fait.

Autres conseils

Essayer:

chcp 65001

qui modifiera la page de code en UTF-8. En outre, vous devez utiliser des polices de 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 vers les fichiers incluent des caractères spécifiques au tchèque.

La solution qui fonctionne pour moi est:

Dans le fichier batch, modifiez la page Charset

Mon fichier de lots:

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

Le fichier batch doit être enregistré dans CP 1250.

Notez que la console ne montrera pas les personnages correctement, mais il les comprendra ...

Vérifiez la langue pour les programmes non Unicodes. Si vous avez des problèmes avec le russe dans la console Windows, vous devriez définir le russe ici:

Changing language for non-Unicode programs

Il est assez difficile de modifier la page de code par défaut de la console Windows. Lorsque vous recherchez le Web, vous trouvez différentes propositions, mais certaines d'entre elles peuvent briser entièrement vos fenêtres, c'est-à-dire que votre PC ne démarre plus.

La solution la plus sécurisée est celle-ci: accédez à votre clé de registre HKEY_CURRENT_USER\Software\Microsoft\Command Processor et ajouter une valeur de chaîne 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
)

Utilisant @chcp 65001>nul à la place de chcp 65001 Supprime la sortie "Page du code actif: 65001" Vous obtiendrez chaque fois que vous démarrez une nouvelle ligne de commande Windows.

Une liste complète de tous les numéros disponibles que vous pouvez obtenir Identificateurs de pages de codes

Remarque, les paramètres ne s'appliqueront que pour l'utilisateur actuel. Si vous aimez le définir pour tous les utilisateurs, remplacez la ligne SET ROOT_KEY="HKEY_CURRENT_USER" par SET ROOT_KEY="HKEY_LOCAL_MACHINE"

En fait, l'astuce est que l'invite de commande comprend réellement ces caractères non anglais, ne peut tout simplement pas les afficher correctement.

Lorsque j'entre un chemin dans l'invite de commande qui contient des chracteurs non anglais, il est affiché comme "???????????". Lorsque vous soumettez votre commande (CD "????????????" Dans mon cas), tout fonctionne comme prévu.

Sur une machine Windows 10 x64, j'ai fait afficher l'invite de commande des caractères non anglais par:

Ouvrez une invite de commande élevée (exécutez CMD.exe en tant qu'administrateur). Interrogez votre registre pour les polices TrueType disponibles à 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 devons ajouter une police TrueType qui prend en charge les personnages dont vous avez besoin comme Courier New. Nous le faisons en ajoutant des zéros au nom de la chaîne, donc 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 mettons en œuvre 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

Réglez la taille de la police à 20:

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

Activez le montage rapide si vous le souhaitez:

    REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f

Comme je n'ai vu aucune réponse complète pour Python 2.7, je décrirai 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 la console Lucida qui peut être sélectionnée par Cliquez avec le bouton droit sur la barre de titre de l'invite de commande et en cliquant sur le Defaults option. Cela donne également 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, ouvrir ici, Visual Studio) en choisissant Properties Au lieu.
  2. Vous devez définir la page de codes sur cp65001, qui semble être la tentative de Microsoft d'offrir une prise en charge UTF-7 et UTF-8 à l'invite de commande. Faites cela en courant 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 refaire cela à chaque fois que vous lancez cmd.exe.

Pour une solution plus permanente, reportez-vous à Cette réponse sur super utilisateur. Bref, créez un REG_SZ (String) Entrée en utilisant Regedit à HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor et nommez-le AutoRun. Modifier la valeur de celui-ci en chcp 65001. Si vous ne souhaitez pas voir le message de sortie de la commande, utilisez @chcp 65001>nul Au lieu.

Certains programmes ont du mal à interagir avec ce codage, Mingw étant notable qui échoue lors de la compilation avec un message d'erreur absurde. Néanmoins, cela fonctionne très bien et ne provoque pas de bugs avec la majorité des programmes.

Une option vraiment simple consiste à installer un shell Windows Bash tel que Mingw et utilisez cela:

Enter image description here

Il y a un peu de courbe d'apprentissage car vous devrez utiliser la fonctionnalité de ligne de commande UNIX, mais vous allez adorer la puissance de celui-ci 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 goodies habituels * nix comme grep, trouver, moins, etc.

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

  1. J'ai changé l'invite de la police de commandement pour la console Lucida. (Cette étape doit être sans importance pour votre situation. Il ne doit faire qu'avec ce que vous voyez à l'écran et non avec ce qui est vraiment le personnage).

  2. J'ai changé le codepage 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.

J'ai trouvé cette méthode comme utile dans les nouvelles versions de Windows 10:

Allumez cette fonctionnalité: "Beta: Utilisez Unicode UTF-8 pour la prise en charge du langage mondial"

Panneau de configuration -> Paramètres régionaux -> Onglet administratif-> Modifier les paramètres régionaux du système ...

Region Settings

Ce problème est assez ennuyeux. J'ai généralement du caractère chinois dans mon nom de fichier et mon contenu de 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éfinissez la région pour prendre en charge les caractères non UTF 8.

  2. Après cela, la police de Console sera changée en police de ce lieu, et elle modifie également le codage de la console.

Une fois que vous avez fait des étapes précédentes, afin d'afficher le déposer un contenu d'un fichier UTF-8 utilisant l'outil de ligne de commande

  1. Modifiez la page en UTF-8 par chcp 65001
  2. Changement de la police qui prend en charge l'UTF-8, comme la console Lucida
  3. Utilisation type commander pour jeter un œil au contenu du fichier, ou cat Si vous avez installé Ubuntu Bash sur Windows 10
  4. Veuillez noter qu'après avoir défini le codage de la console vers UTF-8, je ne peux pas taper le caractère chinois dans le CMD en utilisant la méthode d'entrée chinoise.

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

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

  1. Copier Con Temp.txt appuyez sur Entrée
  2. Tapez le nom de Path / Fichier [Appuyez sur Entrée
  3. Presse 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 semblera illisible) et collez-le dans votre fichier .bat. L'exécution du .bat créé de cette façon dans le dos de la fenêtre a fonctionné pour me (cyrillique, bulgare).

Une meilleure chose plus propre à faire: installer simplement le pack de langues japonais Microsoft disponible disponible. (D'autres packs de langue orientale fonctionneront également, mais j'ai testé celui du Japon.)

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 comme CMD, WordPad, etc.

Changer la page de code en 1252 fonctionne pour moi. Le problème pour moi est que le symbole Double Doller § est de convertir en un autre symbole par DOS sur Windows Server 2008.

J'ai utilisé CHCP 1252 et un capuchon avant lui dans ma déclaration BCP ^ §.

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

Windows utilise UTF-16 pour l'encodage en deux chaînes d'octets, vous devez donc les obtenir du système d'exploitation dans 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 large: 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

Lis ça: http://utf8everywhere.orgPour des informations détaillées, en particulier si vous soutenez d'autres systèmes d'exploitation.

À partir de juin 2019, avec Windows 10, vous n'aurez pas à modifier le codepage.

Voir "Présentation du terminal Windows" (de Kayla cannelle) et le Microsoft / Terminal.
Grâce à l'utilisation de la police Consolas, partiel Un support Unicode sera fourni.

Comme documenté dans Microsoft/Terminal Numéro 387:

Il y a 87 887 idéographies actuellement dans Unicode. Vous avez aussi besoin de tous?
Nous avons besoin d'une frontière, et les caractères au-delà de cette frontière doivent être gérés par la liaison de secours / police de police / peu importe.

Ce que les consolas devraient couvrir:

  • Caractères qui ont utilisé comme symboles utilisés par les programmes OSS modernes dans la CLI.
  • Ces personnages doivent suivre la conception et les mesures de Consolas, et correctement alignés sur les caractères Consolas existants.

Ce que Consolas ne devrait pas couvrir:

  • Personnages et ponctuation des scripts qui au-delà du latin, du grec et du cyrillique, en particulier les personnages, ont besoin d'une mise en forme complexe (comme l'arabe).
  • Ces personnages devraient être manipulés avec une sel-arrière de la police.

J'ai contourné un problème similaire en supprimant les fichiers nommés Unicode en leur faisant référence dans le fichier batch par leurs noms courts (8 points 3).

Les noms courts peuvent être consultés en faisant dir /x. De toute évidence, cela ne fonctionne qu'avec des noms de fichiers Unicode qui sont déjà connus.

À UTF-8: chcp 65001

Retour à par défaut: chcp 437

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top