- Published on
AutoHotKeyでファイル読み込み時に日本語が文字化けする対策
- Authors
- Name
- Shou Arisaka nyapp.buzz/shou
- short bio
- Z世代の情報技術者。Next.jsで自作SNSを個人開発中。
Windowsパソコンの自動化ソフトウェア、AutoHotKeyでのファイルの読み込みで、日本語や漢字文字などアルファベットでない文字などが文字化けしてしまうの場合の対処についてです。
AutoHotKeyでの文字化け対策記事はいくつか書いているんですが、今回は少し難易度が高いですね。僕はプログラマの勘というやつですぐ解決できましたが、autohotkeyだけしか知らないという方は解決は厳しいかもしれません。とはいえ、安心してください。この記事で解決できますよ。
僕はbashコマンドを実行して標準出力を返す関数をautohotkeyで以下のように実装しておりました。
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
}
いつもは以下のように日本語が混じってくることはなかったのですが。
:*:isodate ::
sendText( RegExReplace( getexec("date +%FT%T%Z") , "\s*(\n|\r\n)$", A_Space) )
return
日本語が含まれた出力が必要になりそうだったので、とりあえずテストしてみると、
:*:hoge ::
sendText( RegExReplace( getexec("bash -c date") , "\s*(\n|\r\n)$", A_Space) )
return
見事に文字化けってしまいました。
で早速解決策ですが。
2通りあります。
FileEncoding , UTF-8
を置くFileRead
の代わりにFileOpen
を使う
どちらの方法にせよ、まずはautohotkeyファイルの文字コードとBOMがしっかり出来ているか確認しましょう。これはautohotkeyerの間では常識です。
以下コマンドで一瞬で解決。
nkf --overwrite --oc=UTF-8-BOM dev.ahk
ではまずひとつめ。
AutoHotKeyではデフォルトのファイルエンコーディングの設定というのができるようで、この変数を定義します。
FileEncoding - Syntax & Usage | AutoHotkeyので、以下のようになる。
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
}
これでおkですが、注意。これは関数内で定義しないと意味ないので、グローバルで定義しないようにしましょう。 グローバルで定義していけました。しかし関数定義よりも前に定義しておく必要があるので注意。先頭行あたりに置いておきましょう。
して、ふたつめ。
FileOpenを使用する方法です。
Force a file to be read as UTF-8? - AutoHotkey Community FileOpen() - Syntax & Usage | AutoHotkey以下のようになります。
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
}
どっちの方法でもいけますが、あとからショートカットが判明したFileEncoding
のほうが使い勝手は良さそうです。
15歳でWordPressサイトを立ち上げ、ウェブ領域に足を踏み入れる。翌年にはRuby on Railsを用いたマイクロサービス開発に着手し、現在はデジタル庁を支えたNext.jsによるHP作成やSaaS開発のプロジェクトに携わりながら、React.js・Node.js・TypeScriptによるモダンなウェブアプリの個人開発を趣味でも行う。
フロントエンドからバックエンドまで一貫したアジャイルなフルスタック開発を得意とし、ウェブマーケティングや広告デザインも必要に応じて担当、広告運用・SEO対策・データ分析まで行う低コストかつ高品質な顧客体験の提供が好評。
国内外から200万人を超える人々に支えられ、9周年を迎えるITブログ「yuipro」の開発者、デザイナーでありライター。現在ベータ段階の自作SNS「nyapp.buzz」を日本一の国産SNSとするべく奮闘中。