¿Cómo usar caracteres Unicode en la línea de comandos de Windows?

Tenemos un proyecto en Team Foundation Server (TFS) que tiene un carácter no inglés (š). Cuando intentamos guiar algunas cosas relacionadas con la construcción, nos topamos con un problema: no podemos pasar la letra š a las herramientas de línea de comandos. El símbolo del sistema o lo que no sea más lo arruina y la utilidad tf.exe no puede encontrar el proyecto especificado.

Probé diferentes formatos para el archivo .bat (ANSI, UTF-8 con y sin lista de materiales ), así como secuencias de comandos en JavaScript (que es inherentemente Unicode), pero no tuve suerte. ¿Cómo ejecuto un progtwig y le paso una línea de comando Unicode ?

Mi experiencia: utilizo la entrada / salida Unicode en una consola durante años (y lo hago mucho a diario. Además, desarrollo herramientas de soporte para exactamente esta tarea). Hay muy pocos problemas, en la medida en que comprenda los siguientes hechos / limitaciones:

  • CMD y “consola” son factores no relacionados. CMD.exe es uno de los progtwigs que están listos para “trabajar dentro” de una consola (“aplicaciones de consola”).
  • AFAIK, CMD tiene soporte perfecto para Unicode; puede ingresar / sacar todos los caracteres Unicode cuando cualquier página de códigos esté activa.
  • La consola de Windows tiene MUCHO soporte para Unicode, pero no es perfecta (solo “lo suficientemente buena”, ver más abajo).
  • chcp 65001 es muy peligroso. A menos que un progtwig se haya diseñado especialmente para evitar defectos en la biblioteca C runtime de Microsoft (o utilice un CRTL diferente), no funcionaría de manera confiable.
  • Yo trabajo en cp1252 . Como ya dije: para ingresar / sacar Unicode en una consola, no es necesario configurar la página de códigos .

Los detalles

  • Para leer / escribir Unicode en una consola, una aplicación (o su biblioteca de tiempo de ejecución de C) debe ser lo suficientemente inteligente como para no utilizar la API File-I / O, sino la API Console-I / O.
  • Del mismo modo, para leer los argumentos de línea de comandos de Unicode, una aplicación (o su biblioteca de tiempo de ejecución de C) debe ser lo suficientemente inteligente como para usar la API correspondiente.
  • La representación de fonts de consola solo admite caracteres Unicode en BMP (en otras palabras: debajo de U+10000 ). Solo se admite la reproducción de texto simple (por lo que los idiomas europeos y algunos de Asia oriental deberían funcionar bien, siempre que se utilicen formularios precompuestos). [Aquí hay una letra pequeña para el este asiático y para los caracteres U + 0000, U + 0001, U + 30FB.]

Consideraciones prácticas

  • Los valores predeterminados en Window no son muy útiles. Para una mejor experiencia, uno debe sintonizar 3 piezas de configuración:

    • Para salida: fuente de consola. Para mejores resultados, recomiendo mis comstackciones . (Las instrucciones de instalación están presentes allí y también figuran en otras respuestas en esta página).
    • Para entrada: diseño de teclado con capacidad. Para mejores resultados, recomiendo mis diseños .
    • Para entrada: permite la entrada HEX de Unicode .
  • Uno más se metió con “Pegar” en una aplicación de consola (muy técnica):

    • La entrada HEX entrega un personaje en KeyUp de Alt ; todas las otras formas de entregar un personaje en KeyDown ; muchas aplicaciones no están listas para ver a un personaje en KeyUp . (Solo aplicable a aplicaciones que usan la API Console-I / O).
    • Conclusión: muchas aplicaciones no reactjsrían en los eventos de entrada HEX.
    • Además, lo que sucede con un carácter “pegado” depende de la disposición actual del teclado: si el personaje puede escribirse sin usar las teclas de prefijo (pero con una complicada combinación arbitraria de modificadores, como en Ctrl-Alt-AltGr-Kana-Shift-Gray* ) luego 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 dichos caracteres está bien.
    • Sin embargo, los “otros” caracteres se entregan al emular la entrada HEX .

    Conclusión : a menos que el diseño de su teclado admita la entrada de MUCHOS caracteres sin las teclas de prefijo, algunas aplicaciones defectuosas pueden omitir caracteres al Paste través de la interfaz de usuario de la consola: Alt-Space EP . (¡ Esta es la razón por la que recomiendo usar mis diseños de teclado!)

También se debe tener en cuenta que las “consolas” alternativas, más capaces “para Windows no son consolas en absoluto . No son compatibles con las API de Console-I / O, por lo que los progtwigs que dependen de estas API no funcionarán. (Sin embargo, los progtwigs que usan solo “API de File-I / O para los manejadores de archivos de la consola” funcionarían 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 .

Resumen

  • establecer la fuente, el diseño del teclado (y, opcionalmente, permitir la entrada HEX).

  • use solo progtwigs que pasen por las API de Console-I / O y acepte argumentos de línea de comandos Unicode. Por ejemplo, cualquier progtwig comstackdo de cygwin debería estar bien. Como ya dije, CMD está bien.

Tratar:

 chcp 65001 

que cambiará la página de códigos a UTF-8. Además, debe usar las fonts de la consola Lucida.

Tuve el mismo problema (soy de la República Checa). Tengo una instalación en inglés de Windows, y tengo que trabajar con archivos en una unidad compartida. Las rutas a los archivos incluyen caracteres específicos de checo.

La solución que funciona para mí es:

En el archivo por lotes, cambie 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 comprenderá …

Verifique el idioma para progtwigs que no sean Unicode. Si tiene problemas con el ruso en la consola de Windows, debe configurar el ruso aquí:

Cambio de idioma para programas que no son Unicode

En realidad, el truco es que el símbolo del sistema realmente entiende estos caracteres no ingleses, simplemente no puede mostrarlos correctamente.

Cuando ingreso una ruta en el símbolo del sistema que contiene algunos caracteres no ingleses, se muestra como “?? ?????? ?????”. Cuando envía su comando (cd “??? ?????? ?????” en mi caso), todo está funcionando como se esperaba.

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 dañar su Windows por completo, es decir, su PC ya no arranca.

La solución más segura es esta: vaya a la clave del Registro HKEY_CURRENT_USER\Software\Microsoft\Command Processor y agregue el valor de cadena 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 ) 

Usar @chcp 65001>nul lugar de chcp 65001 suprime la salida “Página de códigos activa: 65001” que obtendría cada vez que inicie una nueva ventana de línea de comando.

Una lista completa de todos los números disponibles que puede obtener de Identificadores de páginas de códigos

Tenga en cuenta que la configuración se aplicará solo para el 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"

En una máquina con Windows 10 x64, hice que el símbolo del sistema mostrara caracteres no ingleses por:

Abra un símbolo del sistema elevado (ejecute CMD.EXE como administrador). Consulte en su registro las fonts TrueType disponibles en la consola de la siguiente manera:

  REG query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" 

Verás un resultado como:

  0 REG_SZ Lucida Console 00 REG_SZ Consolas 936 REG_SZ *新宋体932 REG_SZ *MS ゴシック 

Ahora necesitamos 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 

Establecer la fuente predeterminada en “Courier New”:

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

Establecer tamaño de fuente a 20:

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

Habilite la edición rápida si lo desea:

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

Como no he visto ninguna respuesta completa para Python 2.7, describiré los dos pasos importantes y un paso opcional que es bastante útil.

  1. Necesita una fuente con soporte Unicode. Windows viene con la consola Lucida, que se puede seleccionar haciendo clic con el botón 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 ventanas de comandos invocadas de ciertas maneras (por ejemplo, abrir aquí, Visual Studio) al elegir Properties lugar.
  2. cp65001 configurar la página de códigos en cp65001 , que parece ser el bash de Microsoft de ofrecer compatibilidad con UTF-7 y UTF-8 al símbolo del sistema. Haga esto ejecutando chcp 65001 en el símbolo del sistema . Una vez configurado, permanece de esta manera hasta que se cierre la ventana. Tendrá que volver a hacer esto cada vez que ejecute cmd.exe.

Para una solución más permanente, consulte esta respuesta en Super User. En resumen, cree una entrada REG_SZ (String) utilizando regedit en HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor y HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor nombre AutoRun . Cambia el valor de esto a chcp 65001 . Si no desea ver el mensaje de salida desde el comando, use @chcp 65001>nul lugar.

Algunos progtwigs tienen problemas para interactuar con esta encoding, MinGW es uno notable que falla al comstackr con un mensaje de error sin sentido. No obstante, esto funciona muy bien y no causa errores en la mayoría de los progtwigs.

Para un problema similar, (mi problema era mostrar los caracteres UTF-8 de MySQL en un símbolo del sistema),

Lo solucioné así:

  1. 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).

  2. Cambié la página de códigos a Windows-1253. Haga esto en el símbolo del sistema por “chcp 1253”. Funcionó para mi caso en el que quería ver UTF-8.

Una opción realmente simple es instalar un shell bash de Windows como MinGW y usar eso:

Ingrese la descripción de la imagen aquí

Hay un poco de curva de aprendizaje, ya que necesitarás utilizar la funcionalidad de línea de comandos de Unix, pero te encantará su poder y puedes configurar el juego de caracteres de la consola en UTF-8.

Ingrese la descripción de la imagen aquí

Por supuesto, también obtienes todas las cosas habituales de * nix como grep, find, less, etc.

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

  1. Establezca la región para admitir 8 caracteres no utf.

  2. Después de eso, la fuente de la consola se cambiará a la fuente de esa configuración regional y también cambiará la encoding de la consola.

Después de haber realizado los pasos anteriores, para mostrar el contenido del archivo de un archivo UTF-8 usando la herramienta de línea de comandos

  1. Cambia la página a utf-8 por chcp 65001
  2. Cambie a la fuente que admita utf-8, como Lucida Console
  3. Use el comando type para ver el contenido del archivo, o cat si instaló Ubuntu bash en Windows 10
  4. Tenga en cuenta que, después de configurar la encoding de la consola en utf-8, no puedo escribir caracteres chinos en el cmd con el método de entrada chino.

La solución más simple: simplemente use un emulador de consola como http://cmder.net/

Una decisión rápida para los archivos .bat si su computadora muestra su ruta / nombre de archivo correcto cuando lo escribe en la ventana de DOS:

  1. copy con temp.txt [presione Enter]
  2. Escriba la ruta / nombre del archivo [presione Enter]
  3. Presione Ctrl-Z [presione Enter]

De esta forma puedes crear un archivo .txt – temp.txt. Ábralo en el Bloc de notas, copie el texto (no se preocupe, parecerá ilegible) y péguelo en su archivo .bat. Ejecutar el .bat creado de esta manera en la ventana DOS trabajada para mí (cirílico, búlgaro).

Una cosa más limpia que hacer: simplemente instale el paquete de idioma japonés disponible y gratuito de Microsoft. (Otros paquetes de idioma oriental también funcionarán, pero he probado el japonés).

Esto le da las fonts con los conjuntos más grandes de glifos, los convierte en el comportamiento predeterminado, cambia las diversas herramientas de Windows como cmd, WordPad, etc.

Cambiar la página de códigos a 1252 me funciona. El problema para mí es el símbolo double doller § se está convirtiendo a otro símbolo por DOS en Windows Server 2008.

He usado CHCP 1252 y un límite en mi statement de BCP ^ §.

Veo varias respuestas aquí, pero parece que no abordan la pregunta: el usuario quiere obtener la entrada de Unicode desde la línea de comandos.

Windows usa UTF-16 para la encoding en dos cadenas de bytes, por lo que debe obtener estos desde el sistema operativo en su progtwig. Hay dos maneras de hacer esto –

1) Microsoft tiene una extensión que le permite a main tomar una matriz de caracteres amplia: int wmain (int argc, wchar_t * argv []); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2) Llamar a la API de Windows para obtener la versión unicode de la línea de comando 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, particularmente si está apoyando otros sistemas operativos.

Obtuve un problema similar al eliminar archivos con nombres Unicode al referirme a ellos en el archivo de proceso por sus nombres cortos (8 puntos 3).

Los nombres cortos se pueden ver haciendo dir /x . Obviamente, esto solo funciona con los nombres de archivo Unicode que ya se conocen.

Para utf-8: chcp 65001

Volver a la configuración predeterminada: chcp 437