[ 新規に投稿する ]

iniファイルで文字化けNo.10227
おすぎ さん 23/10/30 12:43 [ コメントを投稿する ]
お世話様です。

UTF-8ファイルの英語と日本語のペアを、マクロでiniファイルに書き込んでいます。
ペア数が50を超えるあたりから、iniファイル上の日本語が文字化けします。

文字コードの指定の問題だろうと思うのですが、対処方法が分かりません。

教えていただけますと助かります。
[ ]
RE:10227 iniファイルで文字化けNo.10228
秀丸担当 さん 23/10/30 14:53 [ コメントを投稿する ]
  INIファイルは、旧来のWindowsの仕様で、日本語ならShift-JIS、UnicodeはUTF-16(BOMあり)しか扱うことができないようになっています。
UTF-8は、BOMあり/なしどちらも使えないです。

読み書きは、getinistr/writeinistrではなくgetinistrw/writeinistrwを使う必要があります。
既存のINIファイルがある場合は自動的に変換はされないので、あらかじめUTF-16としてファイルになっている必要があります。

参考までの情報ですが、多くのデータがある場合、最近の手法であればJSONが扱いやすいです。(またしてもjsですみません)
例:
js{
  //読み込み
  a=hidemaru.loadTextFile("c:\\folder\\test.json");
  b=JSON.parse(a);//本当はtry{}catchしたほうがいい
  
  //取得
  message(b.item1);
  
  //設定
  b.item2 = "アイテム2";
  
  //書き込み
  c=b.JSON.stringify(b,null," ");
  hidemaru.saveTextFile("c:\\folder\\test.json",c);
}
ただJSONはファイルを直接編集するのには不向きな面もあったり、既存マクロがあれば大きく書き換える必要があるので、あくまで参考です。
[ ]
RE:10228 iniファイルで文字化けNo.10229
おすぎ さん 23/10/30 15:43 [ コメントを投稿する ]
  ありがとうございます

windows 11を使っていますが、
iniファイルのエンコードは次の5つしか指定できないようです。、
・ANSI
・UTF-16 LF
・UTF-16 BE
・UTF-8
・UTF-8(BOM付き)

JSONを使わずに対処するには、どうしたら良いでしょうか?
[ ]
RE:10229 iniファイルで文字化けNo.10230
秀丸担当 さん 23/10/30 16:38 [ コメントを投稿する ]
  >・ANSI
>・UTF-16 LF
>・UTF-16 BE
>・UTF-8
>・UTF-8(BOM付き)

これはメモ帳での選択だと思いますが、iniファイルはUTF-16 LFがいいです。

秀丸エディタの表現では、以下のような関係になります。
ANSI=日本語(Shift-JIS)(日本語Windowsなら)
UTF-16 LF=Unicode(UTF-16) BOMあり
UTF-16 BE=Unicode(UTF-16,Big-Endian) BOMあり
UTF-8=Unicode(UTF-8) BOMなし
UTF-8(BOM付き)=Unicode(UTF-8) BOMなし
[ ]
RE:10230 iniファイルで文字化けNo.10231
おすぎ さん 23/10/30 16:53 [ コメントを投稿する ]
  おぉ〜なるほど。

ありがとうございます!!

>秀丸エディタの表現では、以下のような関係になります。
>ANSI=日本語(Shift-JIS)(日本語Windowsなら)
>UTF-16 LF=Unicode(UTF-16) BOMあり
>UTF-16 BE=Unicode(UTF-16,Big-Endian) BOMあり
>UTF-8=Unicode(UTF-8) BOMなし
>UTF-8(BOM付き)=Unicode(UTF-8) BOMなし
[ ]
RE:10231 iniファイルで文字化けNo.10232
おすぎ さん 23/10/30 19:34 [ コメントを投稿する ]
すみません。

マクロヘルプの INIファイル系の説明で、次の2つの文章の違いがよく分かりません。

「INIファイルが存在せず、新しく作られる場合はUnicode(UTF-16)(BOM付き)のファイルとして作成されます。
自動的に新しいINIファイルが作成されるようにするためには、ファイル名は必ずフルパスで書かれている必要があります。」

どちらも、新しいINIファイルについて説明しているようで、混乱しています。

[ ]
RE:10232 iniファイルで文字化けNo.10233
秀丸担当 さん 23/10/31 09:59 [ コメントを投稿する ]
  INIファイル名をフルパスで書かない場合、ずっと以前からの互換性の都合で、Windowsフォルダ(C:\Windows)が対象になるという仕様があります。
(互換性のためだけにそうなっているもので、あまり使われることは無いですが)
もしフルパスで書かない場合、Windowsフォルダが対象の新しいINIファイルでよくわからないことになってしまいます。

なんだか複雑ですが、ファイル名は常にフルパスで書くようにしておけば、深く考えなくてもいいということになります。
[ ]
RE:10233 iniファイルで文字化けNo.10234
おすぎ さん 23/10/31 10:42 [ コメントを投稿する ]
  ありがとうございます

つまり、マクロヘルプの2つの文章をまとめると、
・INIファイルを新しく作る場合は、ファイル名は常にフルパスで書くこと
・INIファイルが新しく作られる場合は、Unicode(UTF-16)(BOM付き)のファイル
として作られる

ということでしょうか?
[ ]
RE:10234 iniファイルで文字化けNo.10235
秀丸担当 さん 23/10/31 11:26 [ コメントを投稿する ]
  まとめると、その通りです。
新しく作る/作らないどちらも場合でも、常にフルパスにしておくといいです。
[ ]
RE:10235 iniファイルで文字化けNo.10236
おすぎ さん 23/10/31 13:27 [ コメントを投稿する ]
  もう一つ教えてください。

INIファイルは、
・日本語ならShift-JIS、UnicodeはUTF-16(BOMあり)しか扱うことができない
・UTF-8は、BOMあり/なしどちらも使えない
ということでしたが、

自分がこれまでに作成したiniファイルを調べると、
エンコードは、メモ帳で見て、ANSI(Shift JIS)だったり、 UTF-8 (Unicode UTF
-8 BOMなし) だったりします。

1.ばらつくのはどうしてでしょうか?
2.UTF-8 でも機能しているのはどうしてでしょうか?
[ ]
RE:10236 iniファイルで文字化けNo.10237
秀丸担当 さん 23/10/31 15:22 [ コメントを投稿する ]
  ばらつくの場合があるのは、半角英数字記号だけの、いわゆるASCIIファイルの場合、Shift-JISとUTF-8(BOMなし)の区別が全くないということがあります。
どちらも1文字1バイトで、同じファイルサイズで同じファイル内容です。

日本語の文字など、ASCII文字以外の文字が存在したときに、初めてファイル内容の違いから見分ける手段ができます。
手段ができるというだけで、BOMなしの場合は確実ではなく、内容からの推測になります。

Windows 10のある時期までは、メモ帳でもASCIIファイルから途中で日本語を入れたらShift-JISで、特に問題はありませんでした。
Windows 10の途中から、メモ帳は既定がUTF-8のBOMなしになってしまいました。
例えば、日本語を含んだShift-JISのファイルを開き、いったん日本語だけを削除して保存するとASCIIで、その後日本語を入れて保存すると、UTF-8になってしまいます。
すると他のShift-JISを前提として読み込んでいたものは文字化けしてしまいます。
そういった感じで昔からあるファイル群にメモ帳で書き換えたり追加すると、1フォルダにバラバラなエンコードが混在することになります。

最近のメモ帳はASCIIファイルを読み込んだらUTF-8と表示するようです。
UTF-8でも機能しているとしたら、ASCIIファイルか、Shift-JISだとしても読み込んだ行が半角英数時なのかもしれないです。

エンコードのことをよく理解し、かつWindows Updateの更新内容を毎回全部チェックしている人は理解可能ですが、普通はそんなことわからないと思います。
個人的にはおかしいと思いますが、世の中の流れには勝てないようです。

----

ちなみに秀丸ファイラーClassicを入れて、詳細表示のカラムをカスタマイズして、「推定エンコーディング」をいうのを表示させておくと、ファイル一覧で全部見る方法があります。
参考:以下のページの「推定エンコーディング (Version 1.80)」
https://hide.maruo.co.jp/software/hmfilerclassicnew/index.html
[ ]
RE:10237 iniファイルで文字化けNo.10238
igus さん 23/10/31 19:24 [ コメントを投稿する ]
  横から失礼します。

現在、テキストファイルとかマクロとかほとんどBOM付きutf8を使っています。
秀丸だけでなく ruby から参照したいって場合もあるので
iniファイルだけUTF-16(BOMあり)にするのに違和感があり
結局 iniファイルもBOM付きutf8で保存して秀丸から参照したい場合には
openfile "/h .hoge.ini";
とかで読み込んで必要な値を取り込んでそっと閉じなんて小細工を弄しています。

現状に不満があると言うわけではないのですが
BOM付きutf8で保存したinifileを許容するというのは難しいのでしょうか?
[ ]
RE:10237 iniファイルで文字化けNo.10239
おすぎ さん 23/11/01 09:20 [ コメントを投稿する ]
  ありがとうございます

難しくてよく分かりませんでした(^^;

でも結局、これから iniファイルを扱うときには、次の2つを覚えておこうと思
います。

・INIファイルを新しく作る場合は、ファイル名は常にフルパスで書くこと
・INIファイルが新しく作られる場合は、Unicode(UTF-16)(BOM付き)のファイル
として作られる

ありがとうございました。
[ ]
RE:10238 iniファイルで文字化けNo.10240
秀丸担当 さん 23/11/01 09:27 [ コメントを投稿する ]
  iniファイルがBOM付きUTF-8であれば、確実に変換してもいいと言えるので、許容してもいいかもしれません。
辞書のようなファイルとして使っている場合、少なくとも一度は変換が必要でパフォーマンスがいろいろ心配ではありますが、今後検討しようと思います。
[ ]
RE:10240 iniファイルで文字化けNo.10241
igus さん 23/11/01 18:55 [ コメントを投稿する ]
  ありがとうございます。よろしくお願いします。
[ ]
RE:10239 iniファイルで文字化けNo.10242
おすぎ さん 23/11/02 09:16 [ コメントを投稿する ]
  すみません。

もう一つだけ教えてください。

ファイル名をフルパスで書く、というのは、
$inifile = macrodir + "\\inifolder\\filename.ini"; とかではなくて、
$inifile = "c:\\folder\\macrofolder\\inifolder\\filename.ini"; のように
書くということでしょうか?
[ ]
RE:10242 iniファイルで文字化けNo.10243
秀丸担当 さん 23/11/02 15:33 [ コメントを投稿する ]
  ファイル名をフルパスで書くというのは、以下のどちらでもいいです。
$inifile = macrodir + "\\inifolder\\filename.ini"; 
$inifile = "c:\\folder\\macrofolder\\inifolder\\filename.ini"; 

writeinistrw等を呼ぶ段階でフルパスになっていれば、どんな方法であってもいいです。
[ ]
RE:10243 iniファイルで文字化けNo.10244
おすぎ さん 23/11/02 16:33 [ コメントを投稿する ]
  少し混乱しています。

逆に、ファイル名をフルパスで書かない、というのはどういうことでしょうか?


>ファイル名をフルパスで書くというのは、以下のどちらでもいいです。
>$inifile = macrodir + "\\inifolder\\filename.ini"; 
>$inifile = "c:\\folder\\macrofolder\\inifolder\\filename.ini"; 
[ ]
RE:10244 iniファイルで文字化けNo.10245
秀丸担当 さん 23/11/02 16:43 [ コメントを投稿する ]
  ファイル名をフルパスで書かないというのは、例えば、
$inifile = "filename.ini"; 
のようにしてしまうことです。

例えば、以下のようにすると、現在のフォルダにあるfilename.iniは見ないです。C:\Windows\filename.iniを見てしまいます。

message getinistrw("filename.ini","test","test");
[ ]
RE:10245 iniファイルで文字化けNo.10246
おすぎ さん 23/11/02 18:56 [ コメントを投稿する ]
  なるほど。

分かりました。

ありがとうございました。


>ファイル名をフルパスで書かないというのは、例えば、
>$inifile = "filename.ini"; 
>のようにしてしまうことです。
[ ]

[ 新規に投稿する ]