getinistrwNo.10140
igus さん 23/05/22 08:39
 
getinistrwが期待したように動いてくれずに悩んでおります。

===sjis.ini(sjisで保存)===
[fuga]
hoge=ほげ
===sjis.ini(ここまで)===

===utf8.ini(utf8で保存・BOM無し)===
[fuga]
hoge=ほげ
===utf8.ini(ここまで)===

===test.mac(iniファイルと同じフォルダに作成)===
$s1=getinistr(currentmacrodirectory+"\\sjis.ini","fuga","hoge");
message $s1;  //=>ほげ
$s2=getinistrw(currentmacrodirectory+"\\utf8.ini","fuga","hoge");
message $s2;  //=>縺サ縺
===test.mac(ここまで)===

$2にも「ほげ」が入って欲しいのですが文字が化けてしまいます。
使い方が間違ってるのでしょうか?

[ ]
RE:10140 getinistrwNo.10141
こみやんま さん 23/05/22 09:25
 
Unicodeとしか記載がないから、秀丸的にはおそらく 「utf16 リトリエンディアン(B
OM有)」が対象なんじゃないですかねぇ。

秀丸の使っているファイルオープンのAPI次第ですが、utf8でもBOMをつければ
秀丸から指定のエンコードと実態が食い違って間違っていても、
Win32-API側が正しいエンコードでファイル読み込むから、
BOMつければいけるかもしれないですね。


[ ]
RE:10141 getinistrwNo.10142
igus さん 23/05/22 11:07
 
BOM有りも試したのですがその場合$s=""となってしまい
BOMのせいで一行目がちゃんと読み込めなかったのかと思いました。
仕様がどういう風なのか分かりませんが
この辺もイレギュラーな返り値であるのなら
修正していただけると有り難いと思います。


[ ]
RE:10142 getinistrwNo.10143
igus さん 23/05/22 11:14
 
私的にはrubyに振って対応して一応解決済みですので
急を要する案件ではありません
時間が取れればご回答ください。

[ ]
RE:10143 getinistrwNo.10144
こみやんま さん 23/05/22 11:29
 
UTF8だとBOMありでもむりでしたか。

writeininumw のヘルプを見ると、

```
新しく作られる場合はUnicode(UTF-16)(BOM付き)のファイルとして作成、
```
とありますね。

```
INIファイルをUnicodeとしてあらかじめ用意しておく場合は、Unicode(UTF-16)(BOM
付き)である必要があります。
```

ともあります。

基本的には、UTF8ではなく、
Unicode(UTF-16)(BOM付き) 決め打ちが想定されてますかねぇ。

[ ]
RE:10144 getinistrwNo.10145
でるもんたいいじま さん 23/05/22 11:59
 
でるもんた・いいじまです。

> UTF8だとBOMありでもむりでしたか。
> writeininumw のヘルプを見ると、
>
> ```
> 新しく作られる場合はUnicode(UTF-16)(BOM付き)のファイルとして作成、
> ```
> とありますね。

同じ話題、少し前にも出ていました。

秀丸としては単純に Windows API を呼んでいるだけで、UTF-8に非対応なのもWindow
s側の仕様、ファイルサイズの上限が思いのほか小さいのもWindows側の仕様、という
ことでした。

それにおそらく、上限いっぱいのサイズのiniファイルを実際に運用した場合、速度
面でも膨大な無駄が生じると推測します。

☆ ☆ ☆

ちなみに余談ですが、MS IMEのユーザー辞書にタブ区切りの単語リストをインポート
する場合も、CP932とUTF-16しか受け付けてくれません。UTF-8はBOMをつけてもダメ
です。

とはいえ、私が使っているのは1世代前のMS IMEでして(Office2010やWindows7のこ
ろから大きな変更なしに維持されているバージョン)、最近(2-3年くらい前?)登
場した新タイプのMS IMEなら、UTF-8のテキストを普通にインポート・エクスポート
できるかもしれません、

「メモ帳」がUTF-8に対応したのはいつだったか…これはWindows7あたりかな?

[ ]
RE:10141 getinistrwNo.10146
でるもんたいいじま さん 23/05/22 13:26
 
でるもんた・いいじまです。
スミマセン追記です。

> 秀丸の使っているファイルオープンのAPI次第ですが、

これですが、普通に CreateFileW() を使っているのではありません。
_wfopen() でもありません。
#というか、_wfopen() はWindows限定な関数のはず。

GetPrivateProfileStringW() という、API呼び出し一発で ini ファイルの特定の
キーだけを抽出できるAPIが太古の昔から存在していて(末尾に 'A' や 'W' のつか
ない GetPrivateProfileString() は16ビット時代からあります)、単純にそれを叩
いているだけです。

Microsoftの方針としては「基本的にはレジストリの活用を推奨」という見解ですが、
将来的に少なくとも「各フォルダの desktop.ini を今まで通りに読み書きする機
能」あたりは今後も維持しないといけないので、このあたりのAPIがOSから完全に削
除される可能性は低いと思います。

[ ]