Pregunta

Tenemos un proyecto en Team Foundation Server (TFS) que tiene un carácter no inglés (Š). Al tratar de escribir algunas cosas relacionadas con la construcción, hemos encontrado un problema, no podemos pasar el š Carta a las herramientas de línea de comandos. El símbolo del sistema o lo que no lo arruina, y el tf.exe La utilidad no puede encontrar el proyecto especificado.

He probado diferentes formatos para el archivo .bat (ANSI, UTF-8 con y sin Nacimiento) así como secuestrarlo en JavaScript (que es inherentemente unicode), pero no hay suerte. ¿Cómo ejecuto un programa y lo paso un Unicode ¿línea de comando?

¿Fue útil?

Solución

Mis antecedentes: uso la entrada/salida Unicode en una consola durante años (y lo hago mucho diariamente. Además, desarrollar herramientas de soporte para exactamente esta tarea). Hay muy pocos problemas, hasta donde comprende los siguientes hechos/limitaciones:

  • CMD y "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").
  • HASTA DONDE SE, CMD tiene un soporte perfecto para Unicode; Puede ingresar/emitir todos los chars de Unicode cuando ningún Codepage está activa.
  • La consola de Windows tiene mucho soporte para Unicode, pero no es perfecto (solo "lo suficientemente bueno"; ver más abajo).
  • chcp 65001 es muy peligroso. A menos que un programa se haya diseñado especialmente para trabajar con defectos en la API de Windows (o use una biblioteca de tiempo de ejecución C que tenga estas soluciones), no funcionaría de manera confiable. Win8 soluciona ½ de estos problemas con cp65001, pero el resto todavía es aplicable a Win10.
  • trabajo en cp1252. Como ya dije: Para ingresar/emitir unicode en una consola, uno no necesita establecer la códigos de código.

Los detalles

  • Para leer/escribir unicode en una consola, una aplicación (o su biblioteca de tiempo de ejecución C) debe ser lo suficientemente inteligente como para usar no File-I/O API, pero Console-I/O API. (Para un ejemplo, ver Como lo hace Python.)
  • 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 C) debe ser lo suficientemente inteligente como para usar la API correspondiente.
  • La representación de la fuente de la consola admite solo caracteres unicode en BMP (en otras palabras: a continuación U+10000). Solo se admite la representación de texto simple (por lo que los idiomas europeos, y algunos asiáticos orientales deberían funcionar bien, hasta donde uno usa formas precompuestas). [Hay un letra pequeña menor Aquí para el este de Asia y para los personajes U+0000, U+0001, U+30fb.

Consideraciones prácticas

  • los valores predeterminados en la ventana no son muy útiles. Para la mejor experiencia, uno debe ajustar 3 piezas de configuración:

    • Para la salida: una fuente de consola integral. Para mejores resultados, recomiendo mis construcciones. (Las instrucciones de instalación están presentes allí, y también enumeran otras respuestas en esta página).
    • Para la entrada: un diseño de teclado capaz. Para mejores resultados, recomiendo mis diseños.
    • Para la entrada: Permitir la entrada hexadecimal de Unicode.
  • Una más gotcha con "pegar" en una aplicación de consola (muy técnica):

    • La entrada hexadecimal ofrece un personaje en KeyUp de Alt; todos Las otras formas de entregar un personaje ocurren en KeyDown; tantas aplicaciones no están listas para ver un personaje en KeyUp. (Solo aplicable a las aplicaciones utilizando Console-I/O API.)
    • Conclusión: Muchas aplicaciones no reaccionarían en eventos de entrada hexadecimales.
    • Además, lo que sucede con un carácter "pegado" depende del diseño actual del teclado: si el personaje se puede escribir sin usar teclas de prefijo (pero con una combinación arbitraria complicada de modificadores, como en Ctrl-Alt-AltGr-Kana-Shift-Gray*) Luego se entrega en un KeyPress emulado. 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" personajes son entregados por emulando la entrada hexadecimal.

    Conclusión: A menos que su diseño de teclado admita la entrada de muchos caracteres sin teclas de prefijo, Algunas aplicaciones de errores puede omitir personajes cuando Paste a través de la interfaz de usuario de la consola: Alt-Space E P. (Este ¡Es por eso 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. Ellos no apoyan Console-I/O API, por lo que los programas que dependen de estas API para funcionar no funcionarían. (Sin embargo, los programas que usan solo "API de archivo I/O para los manzados de archivos de la consola" funcionarían bien).

Un ejemplo de tales no esculos es parte de Microsoft's Powershell. No lo uso; para experimentar, presionar y liberar WinKey, luego escriba powershell.


(Por otro lado, hay programas como ConEmu o ANSICON que intentan hacer más: "intentan" interceptar Console-I/O Las API también hacen que las "aplicaciones de consola verdaderas" funcionen. Esto definitivamente funciona para programas de ejemplo de juguete; En la vida real, esto puede o no resolver sus problemas particulares. Experimento.)

Resumen

  • Establezca la fuente, el diseño del teclado (y opcionalmente, permita la entrada hexadecimal).

  • Use solo programas que pasen Console-I/O API, y acepta argumentos de línea de comandos Unicode. Por ejemplo, cualquier cygwin-Compiled Program debería estar bien. Como ya dije CMD también está bien.

UPD: Inicialmente, para un error en cp65001, Estaba mezclando capas de kernel y crtl (Upd²: ¡y la API en modo de usuario de Windows!). También: Win8 arregla la mitad de este error; Aclaré la sección sobre la aplicación "mejor consola" y agregué una referencia a cómo lo hace Python.

Otros consejos

Probar:

chcp 65001

que cambiará la página de código a UTF-8. Además, debe usar fuentes de 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 checos.

La solución que funciona para mí es:

En el archivo por lotes, cambie la página de Charset

Mi archivo por lotes:

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

El archivo por lotes debe guardar en CP 1250.

Tenga en cuenta que la consola no mostrará a los personajes correctamente, pero los comprenderá ...

Consulte el idioma de los programas no Unicode. Si tiene problemas con ruso en la consola de Windows, entonces debe configurar ruso aquí:

Changing language for non-Unicode programs

Es bastante difícil cambiar la expresión de códigos predeterminada de la consola de Windows. Cuando busca en la web, encuentra diferentes propuestas, sin embargo, algunas de ellas pueden romper sus 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 agregar valor de cadena Autorun = chcp 65001.

O puede usar este pequeño script por lotes para las páginas de código 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
)

Usando @chcp 65001>nul en vez de chcp 65001 suprime la salida "Página de código activo: 65001" Obtendrá cada vez que inicia una nueva línea de comando Windows.

Una lista completa de todos los números disponibles que puede obtener Identificadores de la página del código

Nota, 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 realidad, el truco es que el símbolo del sistema realmente entiende estos caracteres que no son del inglés, simplemente no pueden mostrarlos correctamente.

Cuando ingreso a una ruta en el símbolo del sistema que contiene algunos cractadores no ingleses, se muestra como "?????????". Cuando envías tu comando (CD "??????????" En mi caso), todo funciona como se esperaba.

En una máquina 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 su registro de fuentes trueType disponibles a la consola por:

    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 necesitamos agregar una fuente TrueType que admita los personajes que necesita como Courier NUEVO. 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 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

Establezca el tamaño de la fuente en 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 de Unicode. Windows viene con la consola Lucida que puede ser seleccionada por Haga clic con el botón derecho en la barra de título del símbolo del sistema y hacer clic en el Defaults opción. Esto también da acceso a colores. Tenga en cuenta que también puede cambiar la configuración de las ventanas de comando invocadas de ciertas maneras (por ejemplo, abierta aquí, Visual Studio) eligiendo Properties en cambio.
  2. Necesita configurar la página de código en cp65001, que parece ser el intento de Microsoft de ofrecer soporte UTF-7 y UTF-8 al símbolo del sistema. Haz esto corriendo chcp 65001 en el símbolo del sistema. Una vez establecido, permanece así hasta que la ventana está cerrada. Deberá rehacer esto cada vez que lance cmd.exe.

Para una solución más permanente, consulte esta respuesta en Super User. En resumen, crea un REG_SZ (Cadena) Entrada usando Regedit en HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor y nombrarlo AutoRun. Cambiar el valor de la misma chcp 65001. Si no desea ver el mensaje de salida del comando, use @chcp 65001>nul en cambio.

Algunos programas tienen problemas para interactuar con esta codificación, siendo MingW uno notable que falla mientras se compila con un mensaje de error no sensible. No obstante, esto funciona muy bien y no causa errores con la mayoría de los programas.

Una opción realmente simple es instalar un shell de Windows como Mingw Y usa eso:

Enter image description here

Hay una pequeña curva de aprendizaje, ya que necesitará usar la funcionalidad de línea de comandos de Unix, pero le encantará el poder y puede establecer el conjunto de caracteres de la consola en UTF-8.

Enter image description here

Por supuesto, también obtienes todas las cosas habituales *Nix como Grep, Find, menos, etc.

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

Lo resolví así:

  1. Cambié la fuente del símbolo del sistema a la consola Lucida. (Este paso debe ser irrelevante para su situación. Tiene que hacer solo con lo que ves en la pantalla y no con lo que realmente es el personaje).

  2. Cambié la etiqueta de código a Windows-1253. Haces esto en el símbolo del sistema por "CHCP 1253". Funcionó para mi caso en el que quería ver UTF-8.

Encontré este método como útil en nuevas versiones de Windows 10:

Encienda esta característica: "Beta: use Unicode UTF-8 para soporte de idiomas en todo el mundo"

Panel de control -> Configuración regional -> pestaña administrativa-> Cambiar la configuración del sistema ...

Region Settings

Este problema es bastante molesto. Por lo general, tengo carácter chino en mi nombre de archivo y contenido de archivo. Tenga en cuenta que estoy usando Windows 10, aquí está 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 el carácter no UTF 8.

  2. Después de eso, la fuente de la consola se cambiará a la fuente de esa ubicación, y también cambia la codificación de la consola.

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

  1. Cambie la página a UTF-8 por chcp 65001
  2. Cambio a la fuente que admite UTF-8, como la consola Lucida
  3. Usar type comandar para echar un vistazo al contenido del archivo, o cat Si instaló Ubuntu Bash en Windows 10
  4. Tenga en cuenta que, después de establecer la codificación de la consola en UTF-8, no puedo escribir el carácter chino en el CMD utilizando el método de entrada china.

La solución más perezosa: solo 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 la escribe en DOS-Window:

  1. Copiar con temp.txt Presione Enter
  2. Escriba la ruta/nombre del archivo [Presione Enter
  3. Prensa Ctrl-z Presione Enter

De esta manera, crea un archivo .txt - temp.txt. Ábralo en el bloc de notas, copie el texto (no te preocupes, se verá ilegible) y péguelo en tu archivo .bat. Ejecutando el .bat creado de esta manera en Dos-Window funcionó para ME (cirílico, búlgaro).

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

Esto le brinda 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.

Cambiar la página de código a 1252 me está funcionando. El problema para mí es el símbolo Double Doller § se está convirtiendo a otro símbolo de DOS en Windows Server 2008.

He usado CHCP 1252 y un límite antes que en mi declaración BCP ^§.

Veo varias respuestas aquí, pero no parecen abordar la pregunta: el usuario quiere obtener una entrada de Unicode desde la línea de comandos.

Windows usa UTF-16 para codificar en dos cadenas de bytes, por lo que debe 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 amplio: 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 comando wchar_t win_argv = (wchar_t) Commandlinetoargvw (getCommandlinew (), y nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

Lee esto: http://utf8everywhere.orgPara obtener información detallada, particularmente si admite otros sistemas operativos.

A partir de junio de 2019, con Windows 10, no tendrá que cambiar la expresión de códigos.

Ver "Introducción de Windows Terminal" (de Kayla Cinnamon) y el Microsoft/Terminal.
Mediante el uso de la fuente consolas, parcial Se proporcionará soporte de Unicode.

Como se documenta en Microsoft/Terminal Problema 387:

Hay 87,887 ideografías actualmente en Unicode. ¿Necesitas todos ellos también?
Necesitamos un límite, y los personajes más allá de ese límite deben ser manejados por FUENT Fallback / Font Vinking / Lo que sea.

Qué consolas debería cubrir:

  • Caracteres que se usan como símbolos utilizados por los programas modernos de OSS en CLI.
  • Estos personajes deben seguir el diseño y las métricas de Consolas, y correctamente alineados con los caracteres de consolas existentes.

Qué consolas no debería cubrir:

  • Los personajes y la puntuación de los guiones que más allá del latín, griego y cirílico, especialmente los personajes necesitan una configuración compleja (como el árabe).
  • Estos personajes deben ser manejados con Font Sallback.

Puse en torno a un problema similar que elimina los archivos de unicode al referirlos 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 se conocen.

A UTF-8: chcp 65001

Volver al valor predeterminado: chcp 437

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top