[ 新規に投稿する ]

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 リトリエンディアン(BOM有)」が対象なんじゃないですかねぇ。

秀丸の使っているファイルオープンの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に非対応なのもWindows側の仕様、ファイルサイズの上限が思いのほか小さいのも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から完全に削除される可能性は低いと思います。
[ ]

[ 新規に投稿する ]