Autoit 問題解決

Autoit|テキストファイルを書き込むと文字コードが「Unicode」に変わって文字化けしてしまう

今回は、「FileWrite」 でテキストファイルを書き込むと文字コード「ANSI」が「Unicode」に変わって文字化けしてしまう場合の解決法を紹介します。

FileWrite で書き込みを行うには、「FileOpen」で書き込みモードを指定する必要があります。

FileOpen にはたくさんのモードがあり、デフォルトでは読み込みモードになっています。

ファイルを書き込みする場合は、モード「1」または「2」を使用しますが、このまま書き込みをすると、ファイルが文字コード「Unicode」で保存されてしまいます。

元々ファイルの文字コードが「ANSI」で、モード「1」または「2」を使用して書き込みしても「Unicode」で保存されてしまい、日本語が文字化けしてうまく読み取れなくなります。

「ANSI」が「Unicode」に変わってしまう原因

ドキュメントを見ると分かりますが、こちらの 日本語ドキュメントは AutoIt v3.3.6.1 バージョンのもので、少し古くなっています。

FileOpen ( “filename” [, mode ] )

0 = 読み込みモード (デフォルト)
1 = 書き出しモード(追加書き込み)
2 = 書き出しモード(内容消去後、書き込み)
8 = フォルダが無い場合は作成(注意を参照)
16 = バイナリモードを強制 (注意を参照)
32 = Unicode UTF16 Little Endianを使用した読み込み、書き込みモード。読み込みでは既存のBOMをオーバーライドしません。
64 = Unicode UTF16 Big Endianを使用した読み込み、書き込みモード。読み込みでは既存のBOMをオーバーライドしません。
128 = Unicode UTF8 (BOMあり)を使用した読み込み、書き込みモード。読み込みでは既存のBOMをオーバーライドしません。
256 = Unicode UTF8 (BOMなし)を使用した読み込み、書き込みモード。
16384 = 読み込みように開きBOMが存在した場合、ファイル全体のUTF8検出を使用。これを使用しない場合、ファイルの冒頭部分のみUTF8でチェックされます。

https://open-shelf.appspot.com/AutoIt3.3.6.1j/html/functions/FileOpen.htm

古いバージョンには、ANSI モードがないため、「Unicode 」で保存されてしまいます。

解決方法

バージョンを更新することで、ANSI モードが使用可能になります。

最新のドキュメント AutoIt v3.3.16.1 バージョンには、次のモードが追加されています。

filenameFilename of the file to open.
モード
   $FO_ANSI (512) = ANSI の読み書きモードを使用します。
    $FO_UTF16_LE_NOBOM (1024) = Unicode UTF16 リトル エンディアン (BOM なし) 読み取りおよび書き込みモードを使用します。
    $FO_UTF16_BE_NOBOM (2048) = Unicode UTF16 ビッグ エンディアン (BOM なし) 読み取りおよび書き込みモードを使用します。

変数を使用するには FileConstants.au3.のインクルードが必要です。

文字コード「ANSI」で書き込みを行いたい場合は、最新バージョン(3.3.14.0以上 )の AutoIt を使用し、ANSI の読み書きモードを使用して書き込む必要があります。

こちらのページで Autoit の最新バージョンがダウンロードできます。

AutoIt Downloads - AutoIt
You can download the main AutoIt package and other related scripting tools from this page.

「ANSI」モードで書き込みを行うサンプル

$f = FileOpen(@ScriptDir & "\mm.ini", 513); 追加書き込み FileWrite($f, "文字コードANSIで保存します。") FileClose($f) $f = FileOpen(@ScriptDir & "\mm.ini", 514); 内容消去後、書き込み FileWrite($f, "文字コードANSIで保存します。") FileClose($f)
#include <FileConstants.au3> $f = FileOpen(@ScriptDir & "\mm.ini", $FO_APPEND + $FO_ANSI); 追加書き込み FileWrite($f, "文字コードANSIで保存します。") FileClose($f) $f = FileOpen(@ScriptDir & "\mm.ini", $FO_OVERWRITE + $FO_ANSI); 内容消去後、書き込み FileWrite($f, "文字コードANSIで保存します。") FileClose($f)

コメント