2017-08-14 5 views
1

Alors je travaillais sur un jeu de fichiers par lots il y a un moment, et pour une raison quelconque, il imprime un symbole point d'interrogation au lieu du smiley (que vous obtenez lorsque vous appuyez sur Ctrl + A dans une invite de commande).Pourquoi les caractères spéciaux d'un fichier de commandes s'impriment-ils en tant que point d'interrogation?

My Program ScreenShot

J'ai le même problème avec ces autres symboles:

ctrl+a Smiley face 
ctrl+b Dark smiley face 
ctrl+d Diamond 
ctrl+e Clover 
ctrl+f Ace 
ctrl+n Music symbol 
crtl+o Some random circlish symbol 
ctrl+p Left arrow 
ctrl+q Right arrow 
ctrl+r Up and Down arrows 
ctrl+t Line wrap symbol 
ctrl+u Double s 
ctrl+v Thick underscore 
ctrl+w Up and down arrow with a line at the bottom 
ctrl+x Up arrow 
ctrl+y Down arrow 

Source de Instructables Article: Comment vous utilisez des caractères spéciaux dans cmd

I tried it with cmd ScreenShot

Je suis en cours d'exécution Windows 10 Pro avec la dernière mise à jour. J'ai essayé de trouver une solution pour résoudre ce problème mais je n'ai pas réussi. Toute aide serait appréciée.

Répondre

1

Le comportement de l'OEM Alt codes est trompeur pour les codes 1-31 et 127. La page de codes OEM du système est un sur-ensemble d'ASCII. Toutefois, cette plage de codes Alt n'introduit pas de caractères de contrôle ASCII, mais plutôt les caractères que les anciens systèmes IBM PC affichent et impriment parfois pour les caractères de contrôle ASCII. Par exemple, Alt + 1 entre "☺" (U + 263A, visage souriant blanc) au lieu de ASCII SOH (U + 0001, début du cap). Pour aggraver cela, le comportement par défaut de WideCharToMultiByte lors de l'encodage de tels caractères sur la page de codes OEM consiste à utiliser le caractère de contrôle ASCII correspondant en tant que codage best-fit. Un éditeur de texte ne peut donc pas vous avertir que ce que vous voyez n'est pas ce que vous obtiendrez.

La console n'affiche pas les caractères de contrôle comme les anciens caractères graphiques IBM PC. Il interprète certains d'entre eux tels que U + 0009 (tabulation horizontale - avancer le curseur 8 espaces) et U + 000D (retour chariot - avancer le curseur au début de la ligne suivante), mais la plupart d'entre eux sont affichés comme le glyphe de la police en cours pour un caractère non mappé, tel qu'un point d'interrogation encadré ou une boîte vide. Si vous souhaitez imprimer "☺" sur la console, vous devez utiliser l'API de la console, qui fonctionne avec les chaînes Windows Unicode (UTF-16LE) natives. Heureusement CMD est une application Unicode, donc il n'y a aucun problème avec l'impression "☺" à la console. Le problème est quel encodage utiliser pour le script batch. La seule solution générale consiste à enregistrer le fichier de commandes en tant que UTF-8 sans nomenclature (ordre d'octet). Vous aurez besoin d'un éditeur de texte ou d'un éditeur de texte qui peut sauvegarder UTF-8 sans nomenclature, tel que Notepad ++.

CMD décode un script batch ligne par ligne à l'aide de la page de codes de la console héritée, que vous pouvez modifier en UTF-8 à l'aide de la commande chcp.com 65001. Je déconseille de passer en UTF-8 en permanence car, selon la version de Windows, la console a plusieurs bogues avec la page de codes 65001. Vous pouvez passer temporairement en UTF-8 pour charger des chaînes non-ASCII comme variables d'environnement. Sinon, conservez le reste du fichier de traitement en mode ASCII strictement à 7 bits pour éviter les problèmes de localisation.

Voici un exemple.Il y a probablement un moyen plus général d'y parvenir que de créer toutes ces variables d'environnement locales, mais c'est juste pour montrer que cela fonctionne en principe.

graphics_ctl.bat

@echo off 
REM ASCII Control-Character Graphics 
REM File encoding: UTF-8 (no BOM) 

REM Set the console to codepage 65001 (UTF-8). 
for /f "tokens=2 delims=:" %%a in ('chcp.com') do set "CONSOLE_CODEPAGE=%%a" 
set "CONSOLE_CODEPAGE=%CONSOLE_CODEPAGE: =%" 
chcp.com 65001 >NUL 

set "GCTL_WHITE_SMILING_FACE=☺" 
set "GCTL_BLACK_SMILING_FACE=☻" 
set "GCTL_BLACK_HEART_SUIT=♥" 
set "GCTL_BLACK_DIAMOND_SUIT=♦" 
set "GCTL_BLACK_CLUB_SUIT=♣" 
set "GCTL_BLACK_SPADE_SUIT=♠" 
set "GCTL_BULLET=•" 
set "GCTL_INVERSE_BULLET=◘" 
set "GCTL_WHITE_CIRCLE=○" 
set "GCTL_INVERSE_WHITE_CIRCLE=◙" 
set "GCTL_MALE_SIGN=♂" 
set "GCTL_FEMALE_SIGN=♀" 
set "GCTL_EIGHTH_NOTE=♪" 
set "GCTL_BEAMED_EIGHTH_NOTES=♫" 
set "GCTL_WHITE_SUN_WITH_RAYS=☼" 
set "GCTL_BLACK_RIGHT_POINTER=►" 
set "GCTL_BLACK_LEFT_POINTER=◄" 
set "GCTL_UP_DOWN_ARROW=↕" 
set "GCTL_DOUBLE_EXCLAMATION_MARK=‼" 
set "GCTL_PILCROW_SIGN=¶" 
set "GCTL_SECTION_SIGN=§" 
set "GCTL_BLACK_RECTANGLE=▬" 
set "GCTL_UP_DOWN_ARROW_WITH_BASE=↨" 
set "GCTL_UP_ARROW=↑" 
set "GCTL_DOWN_ARROW=↓" 
set "GCTL_RIGHT_ARROW=→" 
set "GCTL_LEFT_ARROW=←" 
set "GCTL_RIGHT_ANGLE=∟" 
set "GCTL_LEFT_RIGHT_ARROW=↔" 
set "GCTL_BLACK_UP_TRIANGLE=▲" 
set "GCTL_BLACK_DOWN_TRIANGLE=▼" 
set "GCTL_HOUSE=⌂" 

REM Restore the previous console codepage. 
chcp.com %CONSOLE_CODEPAGE% >NUL 

graphics_box.bat

@echo off 
REM Box-Drawing Graphics 
REM File encoding: UTF-8 (no BOM) 

REM Set the console to codepage 65001 (UTF-8). 
for /f "tokens=2 delims=:" %%a in ('chcp.com') do set "CONSOLE_CODEPAGE=%%a" 
set "CONSOLE_CODEPAGE=%CONSOLE_CODEPAGE: =%" 
chcp.com 65001 >NUL 

set "GBOX_LIGHT_SHADE=░" 
set "GBOX_MEDIUM_SHADE=▒" 
set "GBOX_DARK_SHADE=▓" 
set "GBOX_LIGHT_VERTICAL=│" 
set "GBOX_LIGHT_VERTICAL_AND_LEFT=┤" 
set "GBOX_VERTICAL_SINGLE_AND_LEFT_DOUBLE=╡" 
set "GBOX_VERTICAL_DOUBLE_AND_LEFT_SINGLE=╢" 
set "GBOX_DOWN_DOUBLE_AND_LEFT_SINGLE=╖" 
set "GBOX_DOWN_SINGLE_AND_LEFT_DOUBLE=╕" 
set "GBOX_DOUBLE_VERTICAL_AND_LEFT=╣" 
set "GBOX_DOUBLE_VERTICAL=║" 
set "GBOX_DOUBLE_DOWN_AND_LEFT=╗" 
set "GBOX_DOUBLE_UP_AND_LEFT=╝" 
set "GBOX_UP_DOUBLE_AND_LEFT_SINGLE=╜" 
set "GBOX_UP_SINGLE_AND_LEFT_DOUBLE=╛" 
set "GBOX_LIGHT_DOWN_AND_LEFT=┐" 
set "GBOX_LIGHT_UP_AND_RIGHT=└" 
set "GBOX_LIGHT_UP_AND_HORIZONTAL=┴" 
set "GBOX_LIGHT_DOWN_AND_HORIZONTAL=┬" 
set "GBOX_LIGHT_VERTICAL_AND_RIGHT=├" 
set "GBOX_LIGHT_HORIZONTAL=─" 
set "GBOX_LIGHT_VERTICAL_AND_HORIZONTAL=┼" 
set "GBOX_VERTICAL_SINGLE_AND_RIGHT_DOUBLE=╞" 
set "GBOX_VERTICAL_DOUBLE_AND_RIGHT_SINGLE=╟" 
set "GBOX_DOUBLE_UP_AND_RIGHT=╚" 
set "GBOX_DOUBLE_DOWN_AND_RIGHT=╔" 
set "GBOX_DOUBLE_UP_AND_HORIZONTAL=╩" 
set "GBOX_DOUBLE_DOWN_AND_HORIZONTAL=╦" 
set "GBOX_DOUBLE_VERTICAL_AND_RIGHT=╠" 
set "GBOX_DOUBLE_HORIZONTAL=═" 
set "GBOX_DOUBLE_VERTICAL_AND_HORIZONTAL=╬" 
set "GBOX_UP_SINGLE_AND_HORIZONTAL_DOUBLE=╧" 
set "GBOX_UP_DOUBLE_AND_HORIZONTAL_SINGLE=╨" 
set "GBOX_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE=╤" 
set "GBOX_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE=╥" 
set "GBOX_UP_DOUBLE_AND_RIGHT_SINGLE=╙" 
set "GBOX_UP_SINGLE_AND_RIGHT_DOUBLE=╘" 
set "GBOX_DOWN_SINGLE_AND_RIGHT_DOUBLE=╒" 
set "GBOX_DOWN_DOUBLE_AND_RIGHT_SINGLE=╓" 
set "GBOX_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE=╫" 
set "GBOX_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE=╪" 
set "GBOX_LIGHT_UP_AND_LEFT=┘" 
set "GBOX_LIGHT_DOWN_AND_RIGHT=┌" 
set "GBOX_FULL_BLOCK=█" 
set "GBOX_LOWER_HALF_BLOCK=▄" 
set "GBOX_LEFT_HALF_BLOCK=▌" 
set "GBOX_RIGHT_HALF_BLOCK=▐" 
set "GBOX_UPPER_HALF_BLOCK=▀" 

REM Restore the previous console codepage. 
chcp.com %CONSOLE_CODEPAGE% >NUL 

graphics_test.bat

@echo off 
setlocal 

set "scriptdir=%~dp0" 
call "%scriptdir%\graphics_ctl.bat" 
call "%scriptdir%\graphics_box.bat" 

echo. 
echo ASCII Control-Character Graphics 
echo ---------------------------------------------- 
echo GCTL_WHITE_SMILING_FACE  = %GCTL_WHITE_SMILING_FACE% 
echo GCTL_BLACK_SMILING_FACE  = %GCTL_BLACK_SMILING_FACE% 
echo GCTL_BLACK_HEART_SUIT  = %GCTL_BLACK_HEART_SUIT% 
echo GCTL_BLACK_DIAMOND_SUIT  = %GCTL_BLACK_DIAMOND_SUIT% 
echo GCTL_BLACK_CLUB_SUIT   = %GCTL_BLACK_CLUB_SUIT% 
echo GCTL_BLACK_SPADE_SUIT  = %GCTL_BLACK_SPADE_SUIT% 
echo GCTL_BULLET     = %GCTL_BULLET% 
echo GCTL_INVERSE_BULLET   = %GCTL_INVERSE_BULLET% 
echo GCTL_WHITE_CIRCLE   = %GCTL_WHITE_CIRCLE% 
echo GCTL_INVERSE_WHITE_CIRCLE = %GCTL_INVERSE_WHITE_CIRCLE% 
echo GCTL_MALE_SIGN    = %GCTL_MALE_SIGN% 
echo GCTL_FEMALE_SIGN    = %GCTL_FEMALE_SIGN% 
echo GCTL_EIGHTH_NOTE    = %GCTL_EIGHTH_NOTE% 
echo GCTL_BEAMED_EIGHTH_NOTES  = %GCTL_BEAMED_EIGHTH_NOTES% 
echo GCTL_WHITE_SUN_WITH_RAYS  = %GCTL_WHITE_SUN_WITH_RAYS% 
echo GCTL_BLACK_RIGHT_POINTER  = %GCTL_BLACK_RIGHT_POINTER% 
echo GCTL_BLACK_LEFT_POINTER  = %GCTL_BLACK_LEFT_POINTER% 
echo GCTL_UP_DOWN_ARROW   = %GCTL_UP_DOWN_ARROW% 
echo GCTL_DOUBLE_EXCLAMATION_MARK = %GCTL_DOUBLE_EXCLAMATION_MARK% 
echo GCTL_PILCROW_SIGN   = %GCTL_PILCROW_SIGN% 
echo GCTL_SECTION_SIGN   = %GCTL_SECTION_SIGN% 
echo GCTL_BLACK_RECTANGLE   = %GCTL_BLACK_RECTANGLE% 
echo GCTL_UP_DOWN_ARROW_WITH_BASE = %GCTL_UP_DOWN_ARROW_WITH_BASE% 
echo GCTL_UP_ARROW    = %GCTL_UP_ARROW% 
echo GCTL_DOWN_ARROW    = %GCTL_DOWN_ARROW% 
echo GCTL_RIGHT_ARROW    = %GCTL_RIGHT_ARROW% 
echo GCTL_LEFT_ARROW    = %GCTL_LEFT_ARROW% 
echo GCTL_RIGHT_ANGLE    = %GCTL_RIGHT_ANGLE% 
echo GCTL_LEFT_RIGHT_ARROW  = %GCTL_LEFT_RIGHT_ARROW% 
echo GCTL_BLACK_UP_TRIANGLE  = %GCTL_BLACK_UP_TRIANGLE% 
echo GCTL_BLACK_DOWN_TRIANGLE  = %GCTL_BLACK_DOWN_TRIANGLE% 
echo GCTL_HOUSE     = %GCTL_HOUSE% 

echo. 
echo Box-Drawing Graphics 
echo ---------------------------------------------- 
echo GBOX_LIGHT_SHADE       = %GBOX_LIGHT_SHADE% 
echo GBOX_MEDIUM_SHADE       = %GBOX_MEDIUM_SHADE% 
echo GBOX_DARK_SHADE       = %GBOX_DARK_SHADE% 
echo GBOX_LIGHT_VERTICAL      = %GBOX_LIGHT_VERTICAL% 
echo GBOX_LIGHT_VERTICAL_AND_LEFT    = %GBOX_LIGHT_VERTICAL_AND_LEFT% 
echo GBOX_VERTICAL_SINGLE_AND_LEFT_DOUBLE  = %GBOX_VERTICAL_SINGLE_AND_LEFT_DOUBLE% 
echo GBOX_VERTICAL_DOUBLE_AND_LEFT_SINGLE  = %GBOX_VERTICAL_DOUBLE_AND_LEFT_SINGLE% 
echo GBOX_DOWN_DOUBLE_AND_LEFT_SINGLE   = %GBOX_DOWN_DOUBLE_AND_LEFT_SINGLE% 
echo GBOX_DOWN_SINGLE_AND_LEFT_DOUBLE   = %GBOX_DOWN_SINGLE_AND_LEFT_DOUBLE% 
echo GBOX_DOUBLE_VERTICAL_AND_LEFT    = %GBOX_DOUBLE_VERTICAL_AND_LEFT% 
echo GBOX_DOUBLE_VERTICAL      = %GBOX_DOUBLE_VERTICAL% 
echo GBOX_DOUBLE_DOWN_AND_LEFT     = %GBOX_DOUBLE_DOWN_AND_LEFT% 
echo GBOX_DOUBLE_UP_AND_LEFT     = %GBOX_DOUBLE_UP_AND_LEFT% 
echo GBOX_UP_DOUBLE_AND_LEFT_SINGLE    = %GBOX_UP_DOUBLE_AND_LEFT_SINGLE% 
echo GBOX_UP_SINGLE_AND_LEFT_DOUBLE    = %GBOX_UP_SINGLE_AND_LEFT_DOUBLE% 
echo GBOX_LIGHT_DOWN_AND_LEFT     = %GBOX_LIGHT_DOWN_AND_LEFT% 
echo GBOX_LIGHT_UP_AND_RIGHT     = %GBOX_LIGHT_UP_AND_RIGHT% 
echo GBOX_LIGHT_UP_AND_HORIZONTAL    = %GBOX_LIGHT_UP_AND_HORIZONTAL% 
echo GBOX_LIGHT_DOWN_AND_HORIZONTAL    = %GBOX_LIGHT_DOWN_AND_HORIZONTAL% 
echo GBOX_LIGHT_VERTICAL_AND_RIGHT    = %GBOX_LIGHT_VERTICAL_AND_RIGHT% 
echo GBOX_LIGHT_HORIZONTAL      = %GBOX_LIGHT_HORIZONTAL% 
echo GBOX_LIGHT_VERTICAL_AND_HORIZONTAL   = %GBOX_LIGHT_VERTICAL_AND_HORIZONTAL% 
echo GBOX_VERTICAL_SINGLE_AND_RIGHT_DOUBLE  = %GBOX_VERTICAL_SINGLE_AND_RIGHT_DOUBLE% 
echo GBOX_VERTICAL_DOUBLE_AND_RIGHT_SINGLE  = %GBOX_VERTICAL_DOUBLE_AND_RIGHT_SINGLE% 
echo GBOX_DOUBLE_UP_AND_RIGHT     = %GBOX_DOUBLE_UP_AND_RIGHT% 
echo GBOX_DOUBLE_DOWN_AND_RIGHT     = %GBOX_DOUBLE_DOWN_AND_RIGHT% 
echo GBOX_DOUBLE_UP_AND_HORIZONTAL    = %GBOX_DOUBLE_UP_AND_HORIZONTAL% 
echo GBOX_DOUBLE_DOWN_AND_HORIZONTAL   = %GBOX_DOUBLE_DOWN_AND_HORIZONTAL% 
echo GBOX_DOUBLE_VERTICAL_AND_RIGHT    = %GBOX_DOUBLE_VERTICAL_AND_RIGHT% 
echo GBOX_DOUBLE_HORIZONTAL      = %GBOX_DOUBLE_HORIZONTAL% 
echo GBOX_DOUBLE_VERTICAL_AND_HORIZONTAL  = %GBOX_DOUBLE_VERTICAL_AND_HORIZONTAL% 
echo GBOX_UP_SINGLE_AND_HORIZONTAL_DOUBLE  = %GBOX_UP_SINGLE_AND_HORIZONTAL_DOUBLE% 
echo GBOX_UP_DOUBLE_AND_HORIZONTAL_SINGLE  = %GBOX_UP_DOUBLE_AND_HORIZONTAL_SINGLE% 
echo GBOX_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE  = %GBOX_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE% 
echo GBOX_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE  = %GBOX_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE% 
echo GBOX_UP_DOUBLE_AND_RIGHT_SINGLE   = %GBOX_UP_DOUBLE_AND_RIGHT_SINGLE% 
echo GBOX_UP_SINGLE_AND_RIGHT_DOUBLE   = %GBOX_UP_SINGLE_AND_RIGHT_DOUBLE% 
echo GBOX_DOWN_SINGLE_AND_RIGHT_DOUBLE   = %GBOX_DOWN_SINGLE_AND_RIGHT_DOUBLE% 
echo GBOX_DOWN_DOUBLE_AND_RIGHT_SINGLE   = %GBOX_DOWN_DOUBLE_AND_RIGHT_SINGLE% 
echo GBOX_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE = %GBOX_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE% 
echo GBOX_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE = %GBOX_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE% 
echo GBOX_LIGHT_UP_AND_LEFT      = %GBOX_LIGHT_UP_AND_LEFT% 
echo GBOX_LIGHT_DOWN_AND_RIGHT     = %GBOX_LIGHT_DOWN_AND_RIGHT% 
echo GBOX_FULL_BLOCK       = %GBOX_FULL_BLOCK% 
echo GBOX_LOWER_HALF_BLOCK      = %GBOX_LOWER_HALF_BLOCK% 
echo GBOX_LEFT_HALF_BLOCK      = %GBOX_LEFT_HALF_BLOCK% 
echo GBOX_RIGHT_HALF_BLOCK      = %GBOX_RIGHT_HALF_BLOCK% 
echo GBOX_UPPER_HALF_BLOCK      = %GBOX_UPPER_HALF_BLOCK% 
+0

Merci! Cela m'a vraiment beaucoup aidé! ☺ –

-1

Eh bien, cela dépend de votre page de code. Vous pouvez le vérifier en allant sur l'invite de commande et en tapant chcp, qui affiche bien votre page de code. Recherchez-le et vous trouverez une liste de caractères que vous pouvez écrire. Fondamentalement, il vous dira quels caractères "spéciaux" vous pouvez taper qui seront affichés. Par exemple, les mines sont 850 (comme beaucoup d'autres) et ne peuvent donc pas afficher les visages souriants. Vous pouvez changer votre page de code par:

Open Windows Control Panel 
Select Region and Language 
Click on the Administrative tab 
Under Language for non-Unicode programs, click on Change System Locale 
Choose the locale 
Click OK 

C'est tout, je pense. J'espère que j'ai aidé!

+0

intéressant. Je vais jeter un coup d'oeil à cela. Merci pour votre réponse. –