無料でRPA!ということで、AutoItを使ってexe作っています。レジストリ読み書きではなく書き換えが簡単なiniファイルの読み込みで日本語使いたいけど・・・
基本文字化けします。iniファイルをメモ帳などで編集し、そこに日本語入れた場合は文字化けします。
1. IniRead,IniWriteはANCIIのみサポート
wikiによるとiniファイル自体古い設計なので、レジストリやXMLベースの設定ファイルを使ってということです。それを無理やりUTF-8とか使うのには限界がありますね・・・
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したほうがいいような気もします。(試していないのでなんとも言えませんが)
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ファイルをメモ帳で編集しないなら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ラッパーを作ればできますね。
コメント