Pregunta:
Si, antes de Mx shell
, ejecuto Cx RET c
( universal-coding-system-argument
), puedo cambiar el sistema de codificación utilizado por el shell. Por lo tanto, dado
echo Straße > foo
foo
se codificará en el CS relacionado.
¿Cómo puedo cambiar el sistema de codificación después de emitir Mx shell
?
De manera más general, ¿cómo puedo configurar la codificación de entrada / salida de comint?
Respuesta:
En lo que respecta a Linux, el comportamiento se puede controlar con:
(setenv "LANG" ENCODING)
antes de llamar a Mx shell
y después desde el búfer de shell con:
(set-buffer-process-coding-system INPUT-ENCODING OUTPUT-ENCODING)
Ambos deben establecerse en un valor compatible con la cadena a representar. La familia de codificación UTF-8 debería funcionar en la mayoría de los casos.
Para aprender sobre la codificación actual, podemos usar:
(getenv "LANG")
(process-coding-system (get-buffer-process (current-buffer)))
Tenga en cuenta que (setenv "LANG" ENCODING)
afecta a todos los procesos creados posteriormente, que heredarán el valor LANG
; (set-buffer-process ...
y (process-coding-system...
son específicos del búfer, por lo que requieren que el búfer relacionado (shell) esté actualizado cuando se llame.
En la mayoría de los casos, esto debería funcionar.
M-S-: (setenv "LANG" "en_US.UTF-8")
M-x shell
M-S-: (set-buffer-process-coding-system 'utf-8-unix 'utf-8-unix)
echo Straße > foo
Por el contrario, usar (setenv "LANG" "en_US")
(sin UTF-8), imprimiría en la consola o en el archivo caracteres extraños.
Es probable que los valores adecuados (basados en UTF-8) ya sean los predeterminados.
En lo que respecta a Windows, la función set-buffer-process-coding-system
todavía se aplica, pero no hay una variable LANG
en Windows. Windows representa las codificaciones en términos de números de página de códigos . Las páginas de códigos a menudo están asociadas a varios idiomas, por ejemplo, la mayoría de los idiomas occidentales (aunque no el inglés de EE. UU.) Se codifican a través de la página de códigos 850. Para obtener información sobre la página de códigos del sistema, consulte la clave de registro:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCP
Cuando en la configuración de idioma cambia el idioma de entrada predeterminado de Windows , es posible que termine cambiando este valor, por ejemplo, cambiar de inglés de EE. UU. A Reino Unido cambia el valor de OEMCP
de 437 a 859. Puede cambiar manualmente este valor y hay una página de códigos equivalente a UTF -8, eso es 65001. Si bien 65001 (UTF-8) podría ser el estándar en el futuro (como ya lo es para Linux), dados los cambios relevantes, puede romper algunas aplicaciones no Unicode con CP 65001. Afortunadamente, es Es posible configurar fácilmente la página de códigos en el símbolo del sistema de Windows, en lugar de en todo el sistema, con el comando chcp
(cambiar la página de códigos). Bajo la perspectiva de Emacs, esto se reduce a:
M-x shell
chcp 65001
dir
type foo.txt
En la práctica, suponiendo que tenga una Windows en inglés, el comando dir
y type
deberían poder mostrar correctamente los nombres de archivo y el contenido del archivo, respectivamente, en ruso o chino.