HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0729
ゆーnotesaveでUTF-16形式で保存したい。10解決


ゆー

リンク

2018/7/29(Sun) 22:03:18|NO.84887

notesaveでUTF-8ではなくUTF-16形式で保存したいのですが、なぜか文字化けしてしまいます。
どうすればいいでしょうか?
cnvstowを使ってみましたがダメでした。

#include "hsp3utf.as" test="ゔ" mes test //UTF16で保存 sdim u_test,256 cnvstow u_test,""+test notesel u_test notesave dir_desktop+"\\utf16.txt" dialog "保存しました。"



この記事に返信する


あらや

リンク

2018/7/29(Sun) 23:03:09|NO.84889

HSPの標準エディタのせいかもしれません。

平仮名の『う』に濁点を付けた文字(文字コード0xE38294)をエディタ上で打ち込むと
カタカナの『ウ』に濁点を付けた文字(文字コード0xE382B4)と認識されてしまうみたいです。

試しにUTF-8で作成した『ゔ』と入れたテキストファイルを変数testに読み込んだ上で
変換及び保存してみると成功しました。

そもそもSJIS用として作られているエディタにUTF-8の文字を打ち込むのが
間違っているのかもしれません。



ゆー

リンク

2018/7/31(Tue) 15:41:49|NO.84906

ユニコード版のHSPスクリプトエディタ(hsed3u8.exe)を使っているので問題ないと思います。
デスクトップに保存したutf16.txtをメモ帳で開いたら「•」と表示されてました。



あらや

リンク

2018/7/31(Tue) 18:11:58|NO.84908

>ユニコード版のHSPスクリプトエディタ(hsed3u8.exe)を使っているので問題ないと思います。
失礼しました。

たぶんですが、メモ帳で開くときに文字コードが間違って認識されているせいかと思います。
UTF-16で『ゔ』だけのテキストファイルを普通にダブルクリックで開くと
ANSIとして開かれるようです。

面倒ですがメモ帳のファイルメニューから開く(CTRL+O)を選び、
文字コードをUnicodeに設定した上でutf16.txt開いてみてください。

Debugウィンドウを表示した状態で実行して変数『u_test』のメモリダンプの内容が
「94 30 00 00 00……」になっていれば正確に変換できています。



ゆー

リンク

2018/7/31(Tue) 19:23:13|NO.84909

ありがとうございます。
文字コードをUnicodeにして、開いたら、ちゃんと「ゔ」と表示されました。

ですが、2つ質問させてください。

テキストファイルを普通にダブルクリックしたときUTF-16で開くようにしたいのですが、どうしたらできますか?

「abc」と書かれたテキストを保存して、メモ帳で開いたら、「a」のところまで切れてしまうのですが、どうすればいいのでしょうか?

#include "hsp3utf.as" test="abc" mes test //UTF16で保存 sdim u_test,256 cnvstow u_test,""+test notesel u_test notesave dir_desktop+"\\utf16.txt" dialog "保存しました。"
よろしくお願いします。



あらや

リンク

2018/7/31(Tue) 20:09:43|NO.84910

>テキストファイルを普通にダブルクリックしたときUTF-16で開くようにしたいのですが、どうしたらできますか?
すみませんがこれは明確な回答ができません。

起動オプションの指定とかもあるんですが、
正直コマンド入力で開くよりもファイルメニューから開く方が手軽に思えるので……。

ANSIで開く起動オプションのコマンド
notepad /A 〇〇.txt

/Wなどの起動オプションもあるようです。


ファイル内の文字数を増やしてメモ帳のプログラム側が自動認識しやすくするとか
そんな対処しかできないですね。

サクラエディタとか機能の多いエディタだと一度UTF-16で開いたファイルは2回目以降
自動でUTF-16で開いてくれるとかありますが、メモ帳にはそこまでの機能は無いですし。


>「abc」と書かれたテキストを保存して、メモ帳で開いたら、「a」のところまで切れてしまう
途中で途切れてしまうのは文字列の中に文字コード『00』が含まれているからですね。
半角文字や全角スペースなどが含まれるとUTF-16では『00』が入ってしまいます。

strlenとか文字列を扱う命令でよくあることですが、
コード『00』が途中にあるとそれ以降が無視されてしまうので
notesaveだと一文字しか保存できないのかと。

この場合はbsaveで保存するしかないでしょうね。

// 文字数に合わせたバイト数を指定しないと変数の容量(64バイト)分保存されてしまう。 bsave dir_desktop+"\\utf16.txt", u_test;



あらや

リンク

2018/7/31(Tue) 20:17:53|NO.84911

訂正

sdimで256を設定しているので256バイトでした。
しかも、注意書きしたくせにバイト数の指定を忘れるという失態まで。。。

// 文字数に合わせたバイト数を指定しないと変数の容量(256バイト)分保存されてしまう。 bsave dir_desktop+"\\utf16.txt", u_test, 6;

失礼しました。



inovia

リンク

2018/7/31(Tue) 20:38:50|NO.84912

> テキストファイルを普通にダブルクリックしたときUTF-16で開くようにしたいのですが、どうしたらできますか?

BOMをテキストの先頭に付与しておけば、メモ帳君はUTF-16であると解釈してくれるはず。
https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF



ゆー

リンク

2018/8/1(Wed) 11:29:26|NO.84915

>あらやさん
ありがとうございます。
『あ』と入れたテキストファイルをUTF-16で保存してみたのですが、メモ帳でUnicodeで開いても「B0」と出てしまいます。

#include "hsp3utf.as" test="あ" mes test //UTF-16で保存 sdim u_test,256 cnvstow u_test,test // 文字数に合わせたバイト数を指定しないと変数の容量(256バイト)分保存されてしまう。 bsave dir_desktop+"\\utf16.txt",u_test,strlen(u_test) dialog "保存しました。"
>inoviaさん
どうやるのでしょうか?
pokeを使えばできるみたいですが...



あらや

リンク

2018/8/1(Wed) 15:52:40|NO.84917

>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つがありますが、特に意味はありません。

最初になんとなくで文字数の方を作ったのですが、
実際に使うのはバイト数の方だったので追加したというだけです。



ゆー

リンク

2018/8/1(Wed) 22:15:55|NO.84923

あまらさんありがとうございます!
BOMを入れてメモ帳で開いたら、文字化けすることなく「ゔ abc あ」と表示されました!
感謝です‼
notesaveだとダメみたいので、bsaveを使うことにします。
ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.