>BOMをテキストの先頭に付与
あー、BOMなんてものもありましたね。
普段使わないのですっかり忘れていました。
>メモ帳でUnicodeで開いても「B0」と出てしまいます。
それはたぶんUnicodeで開けていないからだと思います。
先に文字コードをUnicodeに設定 → ファイルを選択し『開く』という流れだと
ファイルを選択した途端にANSIに切り替わったりするので
先にファイルを選択 → 文字コードをUnicodeに設定し『開く』にしてみてください。
ついでですが、UTF-16の場合strlenだと正確なバイト数が取得できない場合があるので
簡単なモジュールを作ってみました。
#include "hsp3utf.as"
#module
// 文字数を返す(UTF-16用)ただしサロゲートペアには非対応
#defcfunc strlen_utf16w array utfstr
word = 0; // 文字確認用
count_words = 0; // 文字数
repeat
word = wpeek(utfstr, cnt*2); // 一文字ずつ確認
if( word == 0 ) {
// 終端文字を確認したら終了
break;
}
else {
count_words++;
}
loop
return count_words;
// バイト数を返す(UTF-16用)ただしサロゲートペアには非対応
#defcfunc strlen_utf16b array utfstr
word = 0; // 文字確認用
count_bytes = 0; // バイト数
repeat
word = wpeek(utfstr, cnt*2); // 一文字ずつ確認
if( word == 0 ) {
// 終端文字を確認したら終了
break;
}
else {
count_bytes += 2;
}
loop
return count_bytes;
#global
test="ゔ abc あ"
mes test
//UTF16で保存
sdim u_test, 256; // 保存用変数
sdim u_test_sub, 256; // 変換用変数
cnvstow u_test_sub, ""+test; // 文字列をUTF-16に変換
wpoke u_test, 0, 0xFEFF; // 先頭にUTF-16(LE)のBOMを書き込む
memcpy u_test, u_test_sub, strlen_utf16b(u_test_sub), 2, 0; // BOMの後に変換文字列をコピー
// 文字数に合わせたバイト数を指定しないと変数の容量(256バイト)分保存されてしまう。
bsave dir_desktop+"\\utf16.txt", u_test, strlen_utf16b(u_test);
dialog "保存しました。";
BOMも入れてみたので、
メモ帳でいちいち文字コードを設定しなくてもUnicodeで開けると思います。
モジュールには文字数とバイト数の2つがありますが、特に意味はありません。
最初になんとなくで文字数の方を作ったのですが、
実際に使うのはバイト数の方だったので追加したというだけです。