los - unicode raiz cuadrada
¿Cómo usar caracteres Unicode en la línea de comandos de Windows? (17)
Tenemos un proyecto en Team Foundation Server (TFS) que tiene un carácter no inglés (š). Cuando intentamos escribir algunas cosas relacionadas con la construcción, nos hemos topado con un problema: no podemos pasar la carta a las herramientas de línea de comandos. El símbolo del sistema o lo que no lo desordena, y la utilidad tf.exe no puede encontrar el proyecto especificado.
He intentado diferentes formatos para el archivo .bat (ANSI, UTF-8 con y sin BOM ), así como secuencias de comandos en JavaScript (que es Unicode de forma inherente), pero no hay suerte. ¿Cómo ejecuto un programa y le paso una línea de comando Unicode ?
Cambiar la página de códigos a 1252 está funcionando para mí. El problema para mí es que el símbolo double doller § se está convirtiendo en otro símbolo de DOS en Windows Server 2008.
He usado CHCP 1252 y un límite antes que en mi declaración de BCP ^ §.
Como no he visto ninguna respuesta completa para Python 2.7, describiré los dos pasos importantes y un paso opcional que es bastante útil.
- Necesitas una fuente con soporte Unicode. Windows incluye la consola Lucida, que puede seleccionarse haciendo clic derecho en la barra de título del símbolo del sistema y haciendo clic en la opción
Defaults
. Esto también da acceso a los colores. Tenga en cuenta que también puede cambiar la configuración de las ventanas de comandos invocadas de ciertas maneras (por ejemplo, abrir aquí, Visual Studio) seleccionandoProperties
lugar. -
cp65001
configurar la página de códigos encp65001
, que parece ser el intento de Microsoft de ofrecer el soporte de UTF-7 y UTF-8 al símbolo del sistema. Haga esto ejecutandochcp 65001
en el símbolo del sistema . Una vez establecido, permanece así hasta que se cierre la ventana. Tendrá que rehacer esto cada vez que inicie cmd.exe.
Para una solución más permanente, consulte esta respuesta en Superusuario. En resumen, cree una entrada REG_SZ
(Cadena) usando regedit en HKEY_LOCAL_MACHINE/Software/Microsoft/Command Processor
y HKEY_LOCAL_MACHINE/Software/Microsoft/Command Processor
nombre AutoRun
. Cambie su valor a chcp 65001
. Si no desea ver el mensaje de salida del comando, use @chcp 65001>nul
lugar.
Algunos programas tienen problemas para interactuar con esta codificación, siendo MinGW uno notable que falla al compilar con un mensaje de error sin sentido. No obstante, esto funciona muy bien y no causa errores en la mayoría de los programas.
Compruebe el idioma para los programas que no son Unicode. Si tiene problemas con el ruso en la consola de Windows, debe configurar el ruso aquí:
En realidad, el truco es que el símbolo del sistema en realidad entiende estos caracteres que no están en inglés, simplemente no puede mostrarlos correctamente.
Cuando ingreso una ruta en el símbolo del sistema que contiene algunos caracteres que no están en inglés, se muestra como "?? ?????? ?????". Cuando envía su comando (cd "??? ?????? ?????" en mi caso), todo funciona como se esperaba.
En una máquina con Windows 10 x64, hice que el símbolo del sistema mostrara caracteres no ingleses de la siguiente manera:
Abra un símbolo del sistema elevado (ejecute CMD.EXE como administrador). Consulte su registro para las fuentes TrueType disponibles en la consola:
REG query "HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Console/TrueTypeFont"
Verás una salida como:
0 REG_SZ Lucida Console
00 REG_SZ Consolas
936 REG_SZ *新宋体
932 REG_SZ *MS ゴシック
Ahora debemos agregar una fuente TrueType que admita los caracteres que necesita, como Courier New. Hacemos esto agregando ceros al nombre de la cadena, por lo que en este caso el siguiente sería "000":
REG ADD "HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Console/TrueTypeFont" /v 000 /t REG_SZ /d "Courier New"
Ahora implementamos el soporte UTF-8:
REG ADD HKCU/Console /v CodePage /t REG_DWORD /d 65001 /f
Establezca la fuente predeterminada en "Courier New":
REG ADD HKCU/Console /v FaceName /t REG_SZ /d "Courier New" /f
Establecer el tamaño de fuente a 20:
REG ADD HKCU/Console /v FontSize /t REG_DWORD /d 20 /f
Habilita la edición rápida si te gusta:
REG ADD HKCU/Console /v QuickEdit /t REG_DWORD /d 1 /f
Es bastante difícil cambiar la página de códigos predeterminada de la consola de Windows. Cuando busca en la web, encuentra diferentes propuestas, sin embargo, algunas de ellas pueden romper su Windows por completo, es decir, su PC ya no arranca.
La solución más segura es esta: vaya a su clave de registro HKEY_CURRENT_USER/Software/Microsoft/Command Processor
y agregue el valor de String Autorun
= chcp 65001
.
O puede usar este pequeño Batch-Script para las páginas de códigos más comunes.
@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
)
El uso de @chcp 65001>nul
lugar de chcp 65001
suprime la salida "Página de códigos activos: 65001" que obtendría cada vez que inicia una nueva ventana de línea de comandos.
Una lista completa de todos los números disponibles que puede obtener de los identificadores de la página de códigos
Tenga en cuenta que la configuración solo se aplicará al usuario actual. Si desea configurarlo para todos los usuarios, reemplace la línea SET ROOT_KEY="HKEY_CURRENT_USER"
por SET ROOT_KEY="HKEY_LOCAL_MACHINE"
Este problema es bastante molesto. Normalmente tengo caracteres chinos en mi nombre de archivo y contenido de archivo. Tenga en cuenta que estoy usando Windows 10, esta es mi solución:
Para mostrar el nombre del archivo , como dir
o ls
si instaló Ubuntu bash en Windows 10
Establezca la región para admitir 8 caracteres no-utf.
Después de eso, la fuente de la consola cambiará a la fuente de esa configuración regional y también cambiará la codificación de la consola.
Después de haber realizado los pasos anteriores, para mostrar el contenido del archivo de un archivo UTF-8 con la herramienta de línea de comandos
- Cambia la página a utf-8 por
chcp 65001
- Cambie a la fuente que admite utf-8, como Lucida Console
- Use el comando
type
para ver el contenido del archivo, ocat
si instaló Ubuntu bash en Windows 10 - Tenga en cuenta que, después de configurar la codificación de la consola en utf-8, no puedo escribir caracteres chinos en el cmd utilizando el método de entrada chino.
La solución más perezosa: solo use un emulador de consola como http://cmder.net/
Mi experiencia: uso la entrada / salida de Unicode en una consola durante años (y lo hago mucho a diario. Además, desarrollo herramientas de soporte para esta tarea). Hay muy pocos problemas, en la medida en que comprende los siguientes hechos / limitaciones:
-
CMD
y la "consola" son factores no relacionados.CMD.exe
es solo uno de los programas que están listos para “trabajar dentro” de una consola (“aplicaciones de consola”). - AFAIK,
CMD
tiene soporte perfecto para Unicode; puede ingresar / emitir todos los caracteres Unicode cuando una página de códigos está activa. - La consola de Windows tiene MUCHO soporte para Unicode, pero no es perfecta (solo es "lo suficientemente buena"; vea más abajo).
-
chcp 65001
es muy peligroso. A menos que un programa haya sido especialmente diseñado para solucionar defectos en la API de Windows (o utilice una biblioteca de tiempo de ejecución de C que tenga estas soluciones), no funcionaría de manera confiable. Win8 soluciona la mitad de estos problemas concp65001
, pero el resto aún es aplicable a Win10 . - Yo trabajo en
cp1252
. Como ya dije: Para ingresar / salir Unicode en una consola, uno no necesita configurar la página de códigos .
Los detalles
- Para leer / escribir Unicode en una consola, una aplicación (o su biblioteca en tiempo de ejecución de C) debe ser lo suficientemente inteligente como para usar no la API de
File-I/O
, sino la API deFile-I/O
Console-I/O
. (Para ver un ejemplo, vea cómo Python lo hace .) - Del mismo modo, para leer los argumentos de la línea de comandos de Unicode, una aplicación (o su biblioteca en tiempo de ejecución de C) debe ser lo suficientemente inteligente como para usar la API correspondiente.
- La representación de la fuente de la consola solo admite caracteres Unicode en BMP (en otras palabras: debajo de
U+10000
). Solo se admite la representación de texto simple (por lo tanto, los idiomas europeos, y algunos del este asiático, deberían funcionar bien) en la medida en que uno usa formas precompuestas. [Aquí hay una letra pequeña en letra pequeña para Asia oriental y para los caracteres U + 0000, U + 0001, U + 30FB.]
Consideraciones prácticas
Los valores predeterminados en la ventana no son muy útiles. Para una mejor experiencia, uno debe ajustar 3 piezas de configuración:
- Para salida: una fuente de consola completa. Para obtener los mejores resultados, recomiendo mis compilaciones . (Las instrucciones de instalación están presentes allí, y también se enumeran en otras respuestas en esta página).
- Para entrada: una disposición de teclado capaz. Para mejores resultados, recomiendo mis diseños .
- Para entrada: permitir entrada HEX de Unicode .
Un gotcha más con "Pegar" en una aplicación de consola (muy técnica):
- La entrada HEX entrega un carácter en
KeyUp
deAlt
; todas las otras formas de entregar un personaje suceden enKeyDown
; muchas aplicaciones no están listas para ver un personaje enKeyUp
. (Solo aplicable a aplicaciones que utilizan la API deConsole-I/O
). - Conclusión: muchas aplicaciones no reaccionarían en los eventos de entrada HEX.
- Además, lo que sucede con un carácter "Pegado" depende de la distribución actual del teclado: si el carácter se puede escribir sin usar las teclas de prefijo (pero con una combinación de modificadores arbitraria y complicada, como en
Ctrl-Alt-AltGr-Kana-Shift-Gray*
) entonces se entrega en una pulsación de tecla emulada. Esto es lo que cualquier aplicación espera, por lo que pegar cualquier cosa que contenga solo tales caracteres está bien. - Sin embargo, los "otros" caracteres se entregan emulando la entrada HEX .
Conclusión : a menos que la distribución de su teclado admita la entrada de MUCHOS caracteres sin teclas de prefijo, algunas aplicaciones con errores pueden omitir caracteres al
Paste
través de la interfaz de usuario de la consola:Alt-Space EP
. (¡ Es por esto que recomiendo usar mis diseños de teclado!)- La entrada HEX entrega un carácter en
También se debe tener en cuenta que las "consolas alternativas" más capaces "para Windows no son en absoluto consolas . No son compatibles Console-I/O
API de Console-I/O
, por lo que los programas que dependen de estas API para funcionar no funcionarán. (Sin embargo, los programas que usan solo las "API de E / S de archivos para los identificadores de archivos de la consola" funcionarán bien).
Un ejemplo de tal no-consola es una parte de Powershell
de MicroSoft. No lo uso; para experimentar, presione y suelte WinKey
, luego escriba powershell
.
(Por otro lado, hay programas como ConEmu
o ANSICON
que intentan hacer más: "intentan" interceptar las API de Console-I/O
consola para hacer que las "aplicaciones de consola verdaderas" también funcionen. Esto definitivamente funciona para programas de ejemplo de juguetes; en la vida real, esto puede o no resolver sus problemas particulares. Experimente.)
Resumen
establecer fuente, distribución del teclado (y opcionalmente, permitir entrada HEX).
utilice solo programas que pasen por las API de
Console-I/O
y acepte los argumentos de la línea de comandos de Unicode. Por ejemplo, cualquier programa compilado porcygwin
debería estar bien. Como ya dije,CMD
está bien.
UPD: Inicialmente, para un error en cp65001
, estaba mezclando las capas Kernel y CRTL ( UPD²: ¡ y la API de modo de usuario de Windows!). También: Win8 corrige la mitad de este error; Aclaré la sección sobre la aplicación "mejor consola" y agregué una referencia a cómo Python lo hace.
Para un problema similar, (mi problema era mostrar los caracteres UTF-8 de MySQL en un indicador de comandos),
Lo resolví así:
Cambié la fuente del símbolo del sistema a Lucida Console. (Este paso debe ser irrelevante para su situación. Tiene que ver solo con lo que ve en la pantalla y no con lo que realmente es el personaje).
Cambié la página de códigos a Windows-1253. Usted hace esto en el símbolo del sistema por "chcp 1253". Funcionó para mi caso donde quería ver UTF-8.
Resolví un problema similar al eliminar archivos con nombre de Unicode al referirme a ellos en el archivo por lotes por sus nombres cortos (8 puntos 3).
Los nombres cortos se pueden ver haciendo dir /x
. Obviamente, esto solo funciona con nombres de archivos Unicode que ya son conocidos.
Tratar:
chcp 65001
que cambiará la página de códigos a UTF-8. Además, necesitas usar las fuentes de consola de Lucida.
Tuve el mismo problema (soy de la República Checa). Tengo una instalación de Windows en inglés y tengo que trabajar con archivos en una unidad compartida. Las rutas a los archivos incluyen caracteres específicos de la República Checa.
La solución que me funciona es:
En el archivo por lotes, cambia la página del juego de caracteres.
Mi archivo por lotes:
chcp 1250
copy "O:/VEŘEJNÉ/ŽŽŽŽŽŽ/Ž.xls" c:/temp
El archivo por lotes debe guardarse en CP 1250.
Tenga en cuenta que la consola no mostrará los caracteres correctamente, pero los entenderá ...
Una cosa más limpia que hacer: simplemente instale el paquete de idioma japonés de Microsoft, gratuito y disponible. (También funcionarán otros paquetes de idiomas orientales, pero he probado el japonés).
Esto le da las fuentes con los conjuntos más grandes de glifos, los convierte en el comportamiento predeterminado, cambia las diversas herramientas de Windows como cmd, WordPad, etc.
Una decisión rápida para los archivos .bat si la computadora muestra su ruta / nombre de archivo correcta cuando la escribe en la ventana de DOS:
- copy con temp.txt [presiona Enter]
- Escriba la ruta / nombre del archivo [presione Enter]
- Presione Ctrl-Z [presione Enter]
De esta manera usted crea un archivo .txt - temp.txt. Ábralo en el Bloc de notas, copie el texto (no se preocupe, se verá ilegible) y péguelo en su archivo .bat. Ejecutar el .bat creado de esta manera en la ventana de DOS funcionó para mí (cirílico, búlgaro).
Una opción realmente simple es instalar un shell de bash de Windows como MinGW y usar eso:
Hay una pequeña curva de aprendizaje, ya que necesitará usar la funcionalidad de línea de comandos de Unix, pero le encantará su potencia y puede configurar el conjunto de caracteres de la consola en UTF-8.
Por supuesto, también obtienes todas las golosinas habituales de * nix como grep, buscar, menos, etc.
Veo varias respuestas aquí, pero parece que no responden a la pregunta: el usuario desea obtener la entrada de Unicode desde la línea de comandos.
Windows usa UTF-16 para codificar en cadenas de dos bytes, por lo que necesita obtenerlos del sistema operativo en su programa. Hay dos maneras de hacer esto -
1) Microsoft tiene una extensión que permite que main tome una matriz de caracteres amplia: int wmain (int argc, wchar_t * argv []); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx
2) Llame a la API de Windows para obtener la versión Unicode de la línea de comandos wchar_t win_argv = (wchar_t ) CommandLineToArgvW (GetCommandLineW (), & nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw
Lea esto: http://utf8everywhere.org para obtener información detallada, especialmente si está soportando otros sistemas operativos.
Para utf-8: chcp 65001
Volver a la configuración predeterminada: chcp 437