~/blog/preventing-japanese-character-encoding-errors-when-reading-files-with-autohotkey
Published on

AutoHotKeyでファイル読み込み時に日本語が文字化けする対策

2824文字5分で読めます–––
閲覧数
Authors
  • avatar
    Name
    Shou Arisaka nyapp.buzz/shou
    short bio
    Z世代の情報技術者。Next.jsで自作SNSを個人開発中。

Windowsパソコンの自動化ソフトウェア、AutoHotKeyでのファイルの読み込みで、日本語や漢字文字などアルファベットでない文字などが文字化けしてしまうの場合の対処についてです。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_790f3d82-05f3-4528-be52-177fc4d21a6c.png

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
https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_2bcb21a3-ac5d-4d32-a09e-04f68f266e08.gif

見事に文字化けってしまいました。

で早速解決策ですが。

2通りあります。

  • FileEncoding , UTF-8を置く
  • FileReadの代わりにFileOpenを使う

どちらの方法にせよ、まずはautohotkeyファイルの文字コードとBOMがしっかり出来ているか確認しましょう。これはautohotkeyerの間では常識です。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_c7835c30-dad8-4865-8341-352a671e9a75.png

以下コマンドで一瞬で解決。

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のほうが使い勝手は良さそうです。

avatar

Shou Arisaka

情報技術者 / Z世代プログラマー / SaaSアプリやSNSを開発
今すぐ話そう!

15歳でWordPressサイトを立ち上げ、ウェブ領域に足を踏み入れる。翌年にはRuby on Railsを用いたマイクロサービス開発に着手し、現在はデジタル庁を支えたNext.jsによるHP作成やSaaS開発のプロジェクトに携わりながら、React.js・Node.js・TypeScriptによるモダンなウェブアプリの個人開発を趣味でも行う。
フロントエンドからバックエンドまで一貫したアジャイルなフルスタック開発を得意とし、ウェブマーケティングや広告デザインも必要に応じて担当、広告運用・SEO対策・データ分析まで行う低コストかつ高品質な顧客体験の提供が好評。
国内外から200万人を超える人々に支えられ、9周年を迎えるITブログ「yuipro」の開発者、デザイナーでありライター。現在ベータ段階の自作SNS「nyapp.buzz」を日本一の国産SNSとするべく奮闘中。

Created with Fabric.js 5.2.4 何かご質問がありますか?