So handhaben Sie Fälle, in denen japanische, Kanji-Zeichen und andere nicht-alphabetische Zeichen beim Lesen von Dateien mit AutoHotKey, Windows-PC-Automatisierungssoftware, unleserlich werden.

Ich habe mehrere Artikel über die Handhabung von Zeichenkodierungsproblemen in AutoHotKey geschrieben, aber diesmal ist es etwas fortgeschrittener. Mit meiner Programmierer-Intuition konnte ich es sofort lösen, aber wenn Sie nur AutoHotKey kennen, könnte die Lösung schwierig sein. Aber keine Sorge. Dieser Artikel wird es lösen.
Ich hatte eine Funktion in AutoHotKey implementiert, um Bash-Befehle auszuführen und die Standardausgabe wie folgt zurückzugeben:
getexec(command){
; Run, bash.exe -c '%command% > /mnt/c/pg/autohotkey/getexec.tmp.txt', ,hide
RunWait, bash.exe -c '%command% > /mnt/c/pg/autohotkey/getexec.tmp.txt', ,hide
; sleep 200
sleep 50
FileRead, OutputVar, C:/pg/autohotkey/getexec.tmp.txt
return OutputVar
}
Normalerweise war kein Japanisch gemischt wie hier:
:*:isodate ::
sendText( RegExReplace( getexec("date +%FT%T%Z") , "\s*(\n|\r\n)$", A_Space) )
return
Aber ich brauchte Ausgaben mit Japanisch, also testete ich es:
:*:hoge ::
sendText( RegExReplace( getexec("bash -c date") , "\s*(\n|\r\n)$", A_Space) )
return

Es war perfekt unleserlich.
Nun zur sofortigen Lösung.
Es gibt zwei Wege:
- Platzieren Sie
FileEncoding , UTF-8 - Verwenden Sie
FileOpenanstelle vonFileRead
In jedem Fall überprüfen Sie zuerst, dass die Zeichenkodierung und BOM der AutoHotKey-Datei richtig eingestellt sind. Dies ist allgemeines Wissen unter AutoHotKey-Benutzern.

Sofort gelöst mit folgendem Befehl:
nkf --overwrite --oc=UTF-8-BOM dev.ahk
Erste Methode:
AutoHotKey ermöglicht das Einstellen einer Standard-Dateikodierung, also definieren Sie diese Variable.
FileEncoding - Syntax & Usage | AutoHotkey
Also wird es:
getexec(command){
; Run, bash.exe -c '%command% > /mnt/c/pg/autohotkey/getexec.tmp.txt', ,hide
RunWait, bash.exe -c '%command% > /mnt/c/pg/autohotkey/getexec.tmp.txt', ,hide
; sleep 200
sleep 50
FileEncoding , UTF-8
FileRead, OutputVar, C:/pg/autohotkey/getexec.tmp.txt
return OutputVar
}
Dies funktioniert, aber beachten Sie: Dies ist bedeutungslos, wenn es nicht innerhalb einer Funktion definiert wird, also definieren Sie es nicht global. Ich konnte es global definieren. Es muss jedoch vor der Funktionsdefinition definiert werden, also seien Sie vorsichtig. Platzieren Sie es um die erste Zeile herum.
Zweite Methode:
Verwendung von FileOpen.
Force a file to be read as UTF-8? - AutoHotkey Community FileOpen() - Syntax & Usage | AutoHotkey
Es wird:
getexec(command){
RunWait, bash.exe -c '%command% > /mnt/c/pg/autohotkey/getexec.tmp.txt', ,hide
; sleep 200
sleep 50
; FileRead, OutputVar, C:/pg/autohotkey/getexec.tmp.txt
file := FileOpen("C:/pg/autohotkey/getexec.tmp.txt", "r", "UTF-8")
content := file.Read()
return content
}
Beide Methoden funktionieren, aber FileEncoding, das später als Abkürzung entdeckt wurde, scheint bequemer zu verwenden zu sein.