INIファイルとユニコード文字No.07750
山紫水明 さん 13/02/16 22:05
 

次のようなマクロを実行します。
//--------------------------------------
$inifile = currentmacrodirectory + "\\test.ini";
message "\ue4";
writeinistr $inifile, "test", "line1", "A";
writeinistr $inifile, "test", "line2", "\ue4";
$a = getinistr($inifile, "test", "line1");
$b = getinistr($inifile, "test", "line2");
message $a + $b;
endmacro;
//--------------------------------------

INIファイルを経るとユニコード文字が維持されません。
何か方法はないでしょうか。

              山紫水明

[ ]
RE:07750 INIファイルとユニコード文字No.07751
h-tom さん 13/02/16 23:40
 

h-tom です。

>INIファイルを経るとユニコード文字が維持されません。
>何か方法はないでしょうか。

前に、要望した覚えがあります。
http://hidemaruo.dip.jp:81/turukame/turukame_3/x1005503.html

現状では、マクロの標準関数で、Unicode文字をINIファイルに保存する方法は
ないので、結局、自前のDLLで、UTF-16LE - UTF-8 変換関数作って、UTF-8で
保存しました。
標準で、encodeURI/decodeURI みたいな関数があればいいのですが。

今の環境でどうにかするとなると、秀丸エディタ本体でiniファイルを操作するか、
自前でencode/decode関数作って変換して保存するかですね。

COM使って、XMLファイルに保存しようかと思ったけど、当時はオブジェクトの
操作ができなくて無理だったなぁ。(今はできますが、XMLの操作は面倒。)

[ ]
RE:07751 INIファイルとユニコード文字No.07752
山紫水明 さん 13/02/17 10:44
 
 h-tomさん,

 いつも貴重な情報とご助言ありがとうございます。

>今の環境でどうにかするとなると、秀丸エディタ本体でiniファイルを操作するか、
>自前でencode/decode関数作って変換して保存するかですね。

 秀丸マクロ以外はほとんど能がないのですが,とりあえずは,今回は比較的単純
な事例なので次のようにしてしのげそうです。
//--------------------------------------
message "\ue4";
$inifile = currentmacrodirectory + "\\test.ini";
writeinistr $inifile, "test", "line1", "A";
writeinistr $inifile, "test", "line2", "\\ue4";
$a = getinistr($inifile, "test", "line1");
call CheckUnicode $a;
$a = $$return;
$b = getinistr($inifile, "test", "line2");
call CheckUnicode $b;
$b = $$return;
message $a + $b;
endmacro;

CheckUnicode:
##n = strstr($$1, "\\u");
if( ##n >= 0 ) {
    $$1 = leftstr($$1, ##n) + unichar(val("0x" + midstr($$1, ##n + 2, 2))) +
midstr($$1, ##n + 4);
}
return $$1;
//--------------------------------------

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:07752 INIファイルとユニコード文字No.07753
h-tom さん 13/02/17 13:23
 

h-tom です。

念の為。
>message "\ue4";

>Unicodeで文字コードを指定したい場合は、\uの後に16進数4桁で指定します。
ということで、"\u"で、Unicodeを指定する場合は、4桁で指定しておいた方が
いいかもしれません。
(前に試した時は、2桁は問題なかったけど、3桁だと変な動きをしたかな?)

[ ]
RE:07753 INIファイルとユニコード文字No.07754
山紫水明 さん 13/02/17 17:46
 
 h-tomさん,

>"\u"で、Unicodeを指定する場合は、4桁で指定しておいた方が
>いいかもしれません。

 おお,そうでした。今回はたまたま2桁で問題なかったのですが,全角文字も
含める場合も考慮すれば,当然そうすべきですね。

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:07754 INIファイルとユニコード文字No.07757
秀丸担当 さん 13/02/19 09:29
 

INIファイルのUnicode化は、h-tomさんが言われるように以前話に上がったこと
があります。
Unicode版の文を追加したりすること自体はそれほど難しいことではないですが、
あらかじめBOM付きのUTF-16テキストファイルとして存在しない限り、Unicode版
であっても結局ANSI版と同じになってしまうので確実なものにはならないという
点と、WindowsAPIとしてその仕様が定められているわけではなく、やってみたら
できたというもので、仕様として保証できるものではなくなってしまうと思われ
ます。
山紫水明さんの取られた方法のような、文字列を変換する手法はいいと思います。

[ ]
RE:07757 INIファイルとユニコード文字No.07758
山紫水明 さん 13/02/19 22:01
 
 秀丸担当さん,

 コメントいただきありがとうございます。

>文字列を変換する手法はいいと思います。

 お墨付きをいただいたようでありがたく思います。ただ,こういう使用法がで
きるのは限られた局面だけかもしれませんね。

                          山紫水明

[ ]