Comment utiliser les caractères Unicode en ligne de commande Windows?


317

Nous avons un projet dans Team Foundation Server (TFS) qui contient un caractère non anglais (š). Lorsque nous essayons de scripter quelques éléments liés à la construction, nous sommes tombés sur un problème - nous ne pouvons pas transmettre la lettre š aux outils de ligne de commande. L'invite de commande ou quoi d'autre le gâche, 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 scriptage en JavaScript (qui est intrinsèquement Unicode) - mais pas de chance. Comment exécuter un programme et lui passer une ligne de commande Unicode ?


1
@JohannesDewender - Le copier-coller a mal tourné?
Vilx

2
Python 3.6: "la console par défaut sous Windows accepte tous les caractères Unicode avec cette version" (enfin, la plupart pour moi) MAIS vous devez configurer la console: clic droit en haut des fenêtres (du cmd ou du python IDLE ), par défaut / police choisissez la "console Lucida".
JinSnow



2
@ LưuVĩnhPhúc - Non, il s'agit de passer des arguments de ligne de commande unicode, plutôt que d'afficher du texte dans la console. La console peut ne pas s'impliquer du tout.
Vilx

Réponses:


68

Mon parcours: j'utilise les entrées / sorties Unicode dans une console depuis 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, pour autant que vous compreniez les faits / limitations suivants:

  • CMDet «console» sont des facteurs indépendants. CMD.exeest juste un des programmes qui sont prêts à «fonctionner à l'intérieur» d'une console («applications console»).
  • AFAIK, CMDa un support parfait pour Unicode; vous pouvez entrer / sortir tous les caractères Unicode lorsqu'une page de code est active.
  • La console Windows a BEAUCOUP de support pour Unicode - mais elle n'est pas parfaite (juste "assez bien"; voir ci-dessous).
  • chcp 65001est très dangereux. À moins qu'un programme ait été 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), il ne fonctionnerait pas de manière fiable. Win8 corrige la moitié de ces problèmes cp65001, mais le reste est toujours applicable à Win10 .
  • Je travaille cp1252. Comme je l'ai déjà dit: Pour entrer / sortir Unicode dans une console, il n'est pas nécessaire de définir la page de code .

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' File-I/OAPI, mais l' Console-I/OAPI. (Pour un exemple, voyez comment Python le fait .)
  • 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 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 d'Asie de l'Est - devraient fonctionner correctement - dans la mesure où l'on utilise des formes précomposées). [Il y a des petits caractères 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 sur Windows ne sont pas très utiles. Pour une meilleure expérience, il faut régler 3 éléments de configuration:

    • Pour la sortie: une police de console complète. Pour de meilleurs résultats, je recommande mes versions . (Les instructions d'installation y sont présentes - et également répertorié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: autorisez l'entrée HEX d'Unicode .
  • Encore un gotcha avec "Pasting" dans une application console (très technique):

    • Entrée HEX offre un caractère sur KeyUpdes Alt; toutes les autres façons de livrer un personnage se produisent KeyDown; tant d'applications ne sont pas prêtes à voir un personnage KeyUp. (Applicable uniquement aux applications utilisant l' Console-I/OAPI.)
    • 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 actuelle du clavier: si le caractère peut être tapé 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 fourni 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 fournis en émulant l'entrée HEX .

    Conclusion :moinsvotre misepage clavier prendchargeentrée d'un grand nombre de caractères sans touches préfixe, certaines applications buggy peut sautercaractères lorsque vousPastevia l'interface utilisateur deconsole:Alt-Space E P. ( C'est pourquoi je recommande d'utiliser mes dispositions de clavier!)

Il ne faut pas oublier non plus que les «consoles alternatives« plus performantes »» pour Windows ne sont pas du tout des consoles . Ils ne prennent pas en charge les Console-I/OAPI, donc les programmes qui s'appuient sur ces API pour fonctionner ne fonctionneraient pas. (Les programmes qui n'utilisent que des «API d'E / S de fichier pour les descripteurs de fichiers de la console» fonctionneraient bien, cependant.)

Un exemple d'une telle non-console fait partie de MicroSoft Powershell. Je ne l'utilise pas; pour expérimenter, appuyez et relâchez WinKey, puis tapez powershell.


(D'un autre côté, il existe des programmes tels que ConEmuou ANSICONqui essaient d'en faire plus: ils «tentent» d'intercepter les Console-I/OAPI pour que les «vraies applications de console» fonctionnent également. Cela fonctionne certainement pour les exemples de programmes jouets; dans la vie réelle, cela peut peut ne pas résoudre vos problèmes particuliers. Expérience.)

Résumé

  • définir la police, la disposition du clavier (et éventuellement autoriser la saisie HEX).

  • utilisez uniquement des programmes qui passent par des Console-I/OAPI et acceptez les arguments de ligne de commande Unicode. Par exemple, tout cygwinprogramme compilé devrait convenir. Comme je l'ai déjà dit, CMDc'est bien aussi.

UPD: Au départ, pour un bug cp65001, je mélangeais les couches noyau et 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.


OK, pour quelque chose cette profondeur, vous méritez d'être la réponse acceptée! Impressionnant!
Vilx

5
Je suis un débutant en C ++ et ne peux pas comprendre cette réponse après avoir lu attentivement. Quelqu'un peut-il m'aider à ce sujet ou faire une explication plus facile?
Rick

@Bachi Grâce à Bachi, j'ai découvert que la version 73 de ma disposition de clavier (mentionnée ci-dessus) manquait certains fichiers de support. Maintenant réparé! (A en juger par mes .logfichiers, c'est un bug intermittent dans zip -ru[?!]. Je n'ai aucune idée de comment le déboguer - ou éviter à l'avenir…)
Ilya Zakharevich

@Rick: C'est vrai! J'ai ajouté un lien vers une solution de contournement en Python (mais je ne trouve pas de lien direct vers le patch pour le moment…).
Ilya Zakharevich

@IlyaZakharevich: D Merci. Mais je renonce en quelque sorte à utiliser l'unicode sous Windows. Je vais utiliser Linux ultérieurement.
Rick

387

Essayer:

chcp 65001

ce qui changera la page de codes en UTF-8. Vous devez également utiliser les polices de la console Lucida.


18
Savez-vous s'il existe un moyen d'en faire la valeur par défaut?
AnnanFay

82
Notez qu'il existe de sérieux bogues d'implémentation dans la prise en charge de la page de codes 65001 de Windows qui briseront de nombreuses applications qui reposent sur les méthodes d'E / S de la bibliothèque C standard, ce qui est donc très fragile. (Les fichiers batch cessent également de fonctionner en 65001.) Malheureusement, UTF-8 est un citoyen de seconde classe sous Windows.
bobince

7
@bobince Avez-vous un exemple de bogue dans le support de la page de codes 65001 de Windows? Je suis curieux parce que je n'en ai jamais rencontré, et la recherche sur Google n'a rien donné non plus. (Les fichiers batch ne fonctionnent pas, bien sûr, mais UTF-8 n'est guère un citoyen de seconde classe ...)
Roman Starkov

17
@romkyns: D'après ce que je comprends, les appels qui renvoient un nombre d'octets (tels que fread / fwrite / etc) renvoient en fait un certain nombre de caractères. Cela provoque une grande variété de symptômes, tels qu'une lecture d'entrée incomplète, un blocage dans fflush, les fichiers de commandes cassés, etc. Quelques antécédents. Les pages de codes par défaut utilisées pour les paramètres régionaux "multi-octets" CJK ont une gestion spéciale intégrée pour résoudre ce problème, mais 65001 ne le fait pas - il n'est pas pris en charge .
bobince

7
Question intéressante ici cependant - le bogue est-il dû au fait qu'il devrait signaler des octets et à la place des rapports de caractères - ou parce que les applications qui l'utilisent ont incorrectement supposé octets = caractères? En d'autres termes, s'agit-il d'un échec de l'API ou d'un échec d'utilisation de l'API?
Basic

36

J'ai eu le même problème (je viens de la République tchèque). J'ai une installation en anglais 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 à la République tchèque.

La solution qui fonctionne pour moi est:

Dans le fichier batch, changez la page du jeu de caractères

Mon fichier batch:

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

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

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


1
À votre santé! J'en avais besoin pour pouvoir saisir le caractère du copyright dans mon fichier batch.
Lea Hayes

Cela a parfaitement fonctionné pour moi aussi dans une situation presque identique à la vôtre. Au lieu de cela mon chemin contenait des caractères gaélique irlandais à savoir á, é, í, óet ú.
Seany84

@vanna qui résout mes "caractères et espaces turcs dans le chemin d'accès au problème de réseau". vous êtes formidable.
caglaror


2
Vous avez probablement juste besoin d'utiliser une police différente pour afficher correctement les caractères, Lucida Console a fonctionné pour moi.
Vlastimil Ovčáčík

29

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

Changer la langue des programmes non Unicode


6
Cela n'active pas la prise en charge d'Unicode dans cmd, il ne fait que basculer la page de code par défaut vers cp866laquelle est toujours un jeu de caractères 8 bits. Il utilise même cp866au lieu de cp1251quoi ajoute sa propre merde de problèmes.
ivan_pozdeev

1
Voir aussi ma réponse ci-dessous pour une nouvelle option dans les nouvelles versions de Windows 10
zvi

14

Il est assez difficile de changer la page de codes par défaut de la console Windows. Lorsque vous effectuez une recherche sur le Web, vous trouvez différentes propositions, mais certaines d'entre elles peuvent complètement casser votre Windows, 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 Processoret ajoutez String value Autorun= chcp 65001.

Ou vous pouvez utiliser ce petit Batch-Script pour les pages de codes 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
)

Utiliser @chcp 65001>nulau lieu de chcp 65001supprime la sortie "Page de codes active: 65001" que vous obtiendrez chaque fois que vous démarrez une nouvelle fenêtre de ligne de commande.

Une liste complète de tous les numéros disponibles que vous pouvez obtenir à partir des identificateurs de page de code

Remarque, 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"parSET ROOT_KEY="HKEY_LOCAL_MACHINE"


belle idée et exemple utilisable aussi!

13

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 caractères non anglais, il s'affiche comme "?? ?????? ?????". Lorsque vous soumettez votre commande (cd "??? ?????? ?????" dans mon cas), tout fonctionne comme prévu.


2
C'est probablement un peu dangereux car vous pourriez avoir un conflit de nommage. par exemple, si vous avez deux fichiers qui s'affichent tous les deux comme "???", et que vous entrez "cd ???" il ne saurait pas lequel utiliser (ou pire choisirait un arbitraire).
John

26
Vous n'entrez pas ???, vous entrez le vrai nom, il est simplement affiché comme ???. Considérez-le comme une boîte de saisie de mot de passe. Tout ce que vous entrez est affiché comme ***, mais soumis est le texte original.
Utilisateur

Cela a en effet fonctionné pour les commandes exécutées directement dans l'invite de commande. Cependant, avec l'exécution d'un .cmdfichier de commandes, je dois toujours mettre chcp 65001en haut du fichier de commandes.
wisbucky

Dans votre cas, c'est un problème de police ... le contenu est là, juste pas de police appropriée pour l'afficher. Mais OP est différent.
WesternGun

11

Sur une machine Windows 10 x64, j'ai fait que l'invite de commande affiche les caractères non anglais en:

Ouvrez une invite de commande élevée (exécutez CMD.EXE en tant qu'administrateur). Recherchez dans votre registre les polices TrueType disponibles sur la console en:

    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 qui prend en charge les caractères dont vous avez besoin, comme Courier New. Nous faisons cela en ajoutant des zéros au nom de la 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 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 police sur 20:

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

Activez l'édition rapide si vous le souhaitez:

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

3
En général, l'utilisation de la page de codes 65001 ne fonctionnera sans bogues dans Windows 10 avec la mise à jour des créateurs. Dans Windows 7, il comportera des bogues de sortie et d'entrée. Dans Windows 8 et les versions antérieures de Windows 10, il ne contient que le bogue d'entrée, qui limite l'entrée à ASCII 7 bits.
Eryk Sun,

6

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 qui est assez utile.

  1. Vous avez besoin d'une police prenant en charge Unicode. Windows est livré avec Lucida Console qui peut être sélectionné en cliquant avec le bouton droit sur la barre de titre de l'invite de commande et en cliquant sur l' Defaultsoption. 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 à la Propertiesplace.
  2. Vous devez définir la page de codes sur cp65001, ce qui semble être la tentative de Microsoft pour offrir la prise en charge UTF-7 et UTF-8 à l'invite de commande. Pour ce faire, exécutez chcp 65001dans l'invite de commande . Une fois réglé, il reste ainsi jusqu'à la fermeture de la fenêtre. Vous devrez refaire cela chaque fois que vous lancerez cmd.exe.

Pour une solution plus permanente, reportez-vous à cette réponse sur Super User. En bref, créez une REG_SZentrée (String) à l'aide de regedit at HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processoret nommez-la AutoRun. Modifiez sa valeur en chcp 65001. Si vous ne souhaitez pas voir le message de sortie de la commande, utilisez @chcp 65001>nulplutôt.

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


5

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 des langues dans le monde entier"

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

Paramètres de région


Comment y parvenir en utilisant PowerShell ou CMD?
Corey

J'essaie d'afficher des caractères chinois dans la console et cela n'a pas fonctionné sur Windows 10 64 bits (installé en turc et changé en anglais). Ensuite, je vais essayer d'installer la langue chinoise et voir si cela fonctionne.
akinuri

4

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

Entrez la description de l'image ici

Il y a un peu de courbe d'apprentissage car vous devrez 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.

Entrez la description de l'image ici

Bien sûr, vous obtenez également tous les goodies habituels * nix comme grep, find, less, etc.


Dans ce (vieux) cas, le problème était lié à un script plutôt qu'à une console. L'utilisation de scripts bash résoudrait-elle cela?
Vilx

Oui, en effet, les scripts bash en bois peuvent être marqués comme UTF-8 et fonctionnent simplement avec beaucoup plus de puissance que les fichiers batch Windows - je sais que c'était un ancien cas mais pensais que l'option valait la peine d'être signalée pour référence future car MS ne semble pas pour devenir beaucoup mieux à Unicode.
Steve Barnes


La sortie de caractères codés UTF-8 est correcte. Mais l'entrée est toujours codée par la page de codes du système.
Rick

1
Juste pour ajouter que les utilisateurs de Windows peuvent déjà avoir un shell bash si vous utilisez Git: ouvrez simplement une fenêtre Git> Git Bash .
skomisa

3

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é la police de l'invite de commande en Lucida Console. (Cette étape ne doit pas être pertinente 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 code 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.


7
Windws-1253 n'est pas une page de code Unicode. Il s'agit d'une page de code standard de 256 caractères. Apparemment, vous n'avez utilisé que des caractères qui peuvent être affichés dans cette page de code, mais ce ne sera pas universel.
Vilx

3

Ce problème est assez ennuyeux. J'ai généralement du 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 du fichier , tel que dirou lssi vous avez installé Ubuntu bash sur 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 cet environnement local, et cela modifie également l'encodage de la console.

Après avoir effectué les étapes précédentes, afin d'afficher le contenu d'un fichier UTF-8 à l'aide de l'outil de ligne de commande

  1. Changez la page en utf-8 par chcp 65001
  2. Choisissez la police qui prend en charge utf-8, telle que Lucida Console
  3. Utilisez la typecommande pour consulter le contenu du fichier, ou catsi vous avez installé Ubuntu bash sur Windows 10
  4. Veuillez noter qu'après avoir défini l'encodage de la console sur utf-8, je ne peux pas taper de 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/


Ce n'était pas pour moi. Les caractères chinois dans la sortie de la pointcommande sont encore tronqués.
Ssuching Yu

@SiqingYu J'abandonne le décor fou. Utilisez simplement blog.miniasp.com/post/2015/09/27/Useful-tool-Cmder.aspx
code4j

J'ai utilisé Cmder auparavant, mais il ne peut pas remplacer la console de développeur utilisée par Visual Studio.
Ssuching Yu

@SiqingYu Voulez-vous dire le PowerShell interactif c #?
code4j

Pas le Power Shell interactif, mais la console de développement, également utilisée par Visual C ++. Il s'agit de la console de débogage par défaut dans les projets d'application de console Win32.
Ssuching Yu

2

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 de deux 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 large tableau de caractères: 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 prenez en charge d'autres systèmes d'exploitation.


Ahh, non, je suis désolé, mais vous avez manqué la question. C'est pour quand j'écris un programme qui recevra les caractères unicode. Ma question concernait l' envoi des caractères Unicode à un autre programme (qui, je l'espère, prend en charge leur réception, mais je n'ai vraiment aucun moyen de le savoir, sauf le démontage).
Vilx-

2

À partir de juin 2019, avec Windows 10, vous n'aurez plus à modifier la page de code.

Voir « Présentation de Windows Terminal » (de Kayla Cinnamon ) et Microsoft / Terminal .
Grâce à l'utilisation de la police Consolas, un support partiel Unicode sera fourni.

Comme indiqué dans le Microsoft/Terminalproblème 387 :

Il y a actuellement 87 887 idéogrammes en Unicode. Vous en avez également besoin?
Nous avons besoin d'une limite, et les caractères au-delà de cette limite doivent être gérés par le remplacement de police / liaison de police / quoi que ce soit.

Ce que Consolas devrait couvrir:

  • Caractères utilisés comme symboles utilisés par les programmes OSS modernes en CLI.
  • Ces personnages doivent suivre la conception et les métriques de Consolas et être correctement alignés avec les personnages existants de Consolas.

Ce que Consolas ne doit PAS couvrir:

  • Les caractères et la ponctuation des scripts qui, au-delà du latin, du grec et du cyrillique, en particulier les caractères, nécessitent une mise en forme complexe (comme l'arabe).
  • Ces caractères doivent être traités avec une police de secours.

1

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

  1. copy con temp.txt [appuyez sur Entrée]
  2. Tapez le chemin d'accès / nom de 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 .bat créé de cette façon dans la fenêtre DOS a fonctionné pour moi (cyrillique, bulgare).


1

Une meilleure solution de nettoyage: installez simplement le pack de langue japonais Microsoft disponible et gratuit. (D'autres packs de langues orientales fonctionneront également, 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, change les différents outils Windows comme cmd, WordPad, etc.


1

Changer la page de codes en 1252 fonctionne pour moi. Le problème pour moi est que le symbole double doller § se convertit en un autre symbole par DOS sur Windows Server 2008.

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


Merci ça marche! Je ne sais pas pourquoi les gens ont voté contre, c'est une alternative valable pour certaines personnes. Cette page de code 1252 résout également le problème sur Windows Server 2012, où le même code avec CP 65001 ne fonctionnait pas pour moi. Je suppose que cela dépend de la page de code avec laquelle le script de commandes a été modifié ou des paramètres par défaut du système d'exploitation. Dans ce cas, il a été créé avec le Bloc-notes sur une machine MUI allemande avec un système d'exploitation de base en-US.
Tony Wall

0

J'ai rencontré un problème similaire en supprimant les fichiers nommés Unicode en me référant à eux dans le fichier de commandes par leurs noms courts (8 points 3).

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.