AutoIt iniファイル、日本語の文字化け対応は面倒

AUtoIt IniReadはANCII AutoIT

無料でRPA!ということで、AutoItを使ってexe作っています。レジストリ読み書きではなく書き換えが簡単なiniファイルの読み込みで日本語使いたいけど・・・
基本文字化けします。iniファイルをメモ帳などで編集し、そこに日本語入れた場合は文字化けします。

スポンサーリンク

1. IniRead,IniWriteはANCIIのみサポート

wikiによるとiniファイル自体古い設計なので、レジストリやXMLベースの設定ファイルを使ってということです。それを無理やりUTF-8とか使うのには限界がありますね・・・

INIファイル - Wikipedia

2. 日本語扱うにはIniReadを自作する

2.1 IniReadの代替としてFileOpen,FileReadで行う

iniファイルは以下のような[section] key=value という形になっています。
$val = IniRead(“xx.ini”, “EMAIL”, “emailfrom”, “default@cfautog.tokyo”)
これをFileOpen(xx.ini,..), FileRead(),FileReadLine()で検索する関数_IniRead(..)とか作れば日本語もいけます。

[EMAIL]
emailfrom=cfautog@3mai.jp
emailto=test@cfautog.tokyo

2.2 _IniUnicode()でiniファイルをUnicodeに

AutoItフォーラムにiniファイルがunicodeでなければunicodeに変換して追記するというコードがありました。これ使ってもいいかもですが、FileReadとStringToBinary()したものをini.tmpにしてそれを読み込み、BinaryToStringしたほうがいいような気もします。(試していないのでなんとも言えませんが)

Problem with accent
Hello, My problem is when reading an ini file. I have words with aaccent (like désert, brève, ...). So when I use guictrlsetdata I have brève, désert Thanks i...

2.3 BinaryToString(StringToBinary($str,1),4)

完璧ではありませんが、これで完全な文字化け->少しの文字化けまで解消されます。
但し、完全ではありませんが・・・
IniReadで日本語なんだけどANCIIとして読み込み$valに格納(文字化けしまくり)
それをStringToBinary($val,1)でANCII文字(1)をバイナリに。
BinaryToString(バイナリ,4)でバイナリをUTF-8(4)に。
文字コード詳しくありませんが、ANCIIは7bitだからUTF-8の各1byteのうち1bitがStringToBinary()で0になったりするからですかね?

Local $val = IniRead("xx.ini", "SECTION", "title", "")
$val - BinaryToString(StringToBinary($val,1),4)
Ini files and Unicode/UTF8 characters.. how to handle
HI all, I noticed that iniwrite, iniread do not support Unicode which makes sense cause by the standard they are not supposed too. With that said, I need a way ...

iniファイルをメモ帳で編集しないならStringToBinary()で保存

ただ、テキストエディタでiniファイルを編集しないで、スクリプト内でiniファイルを読み書きするのであれば、IniWriteする日本語をStringToBinary()でバイナリにしそれをIniWrite。
IniRead()したのをBinaryToString()で文字列にすれば大丈夫です。
iniファイル見ると普通の人では認識できないものになっていますが

$str = "これは日本語です"
$str = StringToBinary($str, 4) ;UTF-8の文字をバイナリ形式に
IniWrite("xx.ini", "SECTION", "japanese", $str)
;; Iniファイルには0xE4A324928Ecというようなバイナリテキスト形式で保存される
$str = IniRead("xx.ini", "SECTION", "japanese", "")
$str = BinaryToString($str,4)
MsgBox(0,"",$str)
;元の文字が表示される

4. Iniファイルには半角英数字を使うのが安全で簡単ですね

本来であればIniRead 日本語対応版を公開して!と言われそうですが汗
IniReadをする前に、日本語で書かれたiniファイルを1行ずつ読み込み、ini.tmpファイルにvalのみをStringToBinary($val,4)したものをFileWriteLine($fp, $sbin)
iniファイルのバイナリテキスト版が出来たら、それをIniReadしてBinaryToString($val,4)するIniFileConvert,IniReadラッパーを作ればできますね。

5. 参考リンク

INIファイル - Wikipedia
Ini files and Unicode/UTF8 characters.. how to handle
HI all, I noticed that iniwrite, iniread do not support Unicode which makes sense cause by the standard they are not supposed too. With that said, I need a way ...
Problem with accent
Hello, My problem is when reading an ini file. I have words with aaccent (like désert, brève, ...). So when I use guictrlsetdata I have brève, désert Thanks i...
IniRead function not supporting utf8 with BOM?
IniRead()/IniWrite() cannot read/write ini File encoded by utf8 with BOM. And they also cannot read/write ini file encoded by Unicode big endian. Please fix thi...

コメント

タイトルとURLをコピーしました