init-file – En Windows, Emacs no puede manejar correctamente las codificaciones de los subprocesos, ¿verdad?

Pregunta:

Tengo dos archivos de texto simples en mi unidad D: , como se muestra a continuación.

D: \ 我 .txt

I

D: \ 你 .txt

Ustedes

Después de ejecutar Mx diff y escribir los nombres de archivo correctos (Sí, puedo ingresar chino y el autocompletado de nombres de archivo funciona bien para chino), la salida da lo siguiente.

diff -u "d:/我.txt" "d:/你.txt"
diff: "d:/我.txt": No such file or directory
diff: "d:/ä½ .txt": No such file or directory

Diff finished (diff error).  Wed Jan  4 02:13:20 2017

Tengo MSYS2 instalado con diff reside en D:\msys32\usr\bin\diff.exe .

Ejecuto Emacs 25.1.1 en Windows 7 (en-US), por lo que w32-unicode-filenames está configurado en t , lo que significa que las API nativas de Windows Unicode se utilizan al pasar nombres de archivos al sistema operativo. Esto es bueno, los nombres de archivo Unicode se muestran correctamente en dired-mode y el autocompletado para nombres de archivo Unicode también funciona sin problemas. Entonces sospecho que los nombres de archivo Unicode solo causan problemas al crear subprocesos con argumentos Unicode.

Para verificar eso, ejecuto Mx shell y hago lo siguiente.

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

$ cd
cd
d:\

$ type 我.txt
type 我.txt
The system cannot find the file specified.

$ type 你.txt
type 你.txt
The system cannot find the file specified.
Error occurred while processing: \344\275.
The system cannot find the file specified.
Error occurred while processing: .txt.

$ where cat
where cat
D:\msys32\usr\bin\cat.exe

$ cat 我.txt
cat 我.txt
cat: ''$'\303\246\313\206\342\200\230''.txt': No such file or directory

$ cat 你.txt
cat 你.txt
cat: ''$'\303\244\302\275\302\240''.txt': No such file or directory

Autocompletar para el nombre de archivo Unicode también deja de funcionar en shell-mode .

Y también pruebo comandos similares en eshell-mode invocados por Mx eshell .

Welcome to the Emacs shell

d:/ $ which which
eshell/which is a compiled Lisp function in ‘esh-cmd.el’
d:/ $ which cat
eshell/cat is a compiled Lisp function in ‘em-unix.el’
d:/ $ cat 我.txt
I
d:/ $ cat 你.txt
You
d:/ $ which ls
eshell/ls is a compiled Lisp function in ‘em-ls.el’
d:/ $ ls 我.txt 
我.txt
d:/ $ ls 你.txt 
你.txt
d:/ $ which ls.exe
d:/msys32/usr/bin/ls.exe
d:/ $ ls.exe 我.txt 
/usr/bin/ls: cannot access ''$'\303\246\313\206\342\200\230''.txt': No such file or directory
d:/ $ ls.exe 你.txt 
/usr/bin/ls: cannot access ''$'\303\244\302\275\302\240''.txt': No such file or directory

Casi me confirma que el problema es sobre la codificación del subproceso. Llamar a funciones internas de Elisp con argumentos Unicode funciona bien, pero llamar a ejecutables externos con argumentos Unicode no funciona. También experimento con varias codificaciones para subprocesos. Los configuré en mi archivo de inicio de esta manera.

(setq default-process-coding-system '(raw-text-dos . raw-text-unix))

Pero en vano, ninguno de mis intentos funciona.

Respuesta:

Este no es un problema de Emacs per se. Tiene que ver con la página de códigos predeterminada del intérprete de comandos. Necesita cambiar la página de códigos "shell" a utf8 con chcp 65001 . De forma predeterminada, establece la página de códigos en Latin-1 o CP850 (que creo que son los mismos).

Respuesta actualizada después de investigar un poco más

Resulta que Emacs tiene un historial de problemas con las fuentes chinas. Hay un modo llamado chinese-fonts-setup aquí, lo instalé y solucionó el problema en mi máquina (estoy ejecutando GNU Emacs 24.5.1 (i686-pc-mingw32) en Windows 8.1). Por cierto, las instrucciones de instalación están en chino, tenía que Google Translate + adivinar

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım