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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0526
たろうhspinet.dllのnkfが正しく動作しません6解決


たろう

リンク

2018/5/26(Sat) 14:33:26|NO.84498

今、mesbox命令を使い、テキストエディタを作成しています。
そこで、いろいろな文字コードに対応させるため、
hspinet.dllのnkfcnv命令を使い、文字コードの変換をしています。
ですが、あるテキストファイルを開いたら
元々161396バイトあるテキストファイルがnkfで変換すると32769バイトになって読み込まれてしまいました。(strlenで調べました。)
変換したものと元のものを比べてみると
何度やっても同じ位置で文字列がきれてしまいます。
sdimで最大限に確保しても駄目でした。
全く解決せず困っています。
解決方法が分かる方、よろしくお願いします。



この記事に返信する


あらや

リンク

2018/5/26(Sat) 16:03:39|NO.84499

その元のテキストファイルはUTF-16とかでしょうか。

通常のHSPは文字列の中に文字コードが0になっている箇所があると
それを文字列の終端としてとらえて、以降の文字を扱えなくなります。

strlenも文字コード0までのバイト数しか数えませんので
正確な数値が取得できなくなります。

UTF-16だと、半角英数字・半角記号・全角スペースなどが文字コード0を含むので
その途切れた場所の文字が文字コード0を含んでいる可能性があります。

cnvwtosなどで一旦文字列をSJISに変換してから表示すると上手くいくかもしれません。
(当然SJISで表示できない特殊な文字は無理ですが)



// サンプル exist "testutf16.txt"; size = strsize; mes "ファイルサイズ: "+size+"バイト"; sdim data, size; bload "testutf16.txt", data, size; sdim datas, size; datas = cnvwtos(data); mes "ファイル内容:\n"+datas;


testutf16.txtの内容

abcdefg


実行結果

ファイルサイズ: 14バイト ファイル内容: abcdefg



あらや

リンク

2018/5/26(Sat) 17:46:54|NO.84500

失礼。
微妙にボケてましたね。

こちらで紹介されているencode.asで変換してみてはいかがでしょうか?
http://hsp.tv/play/pforum.php?mode=all&num=84168
nkfcnvとは違った結果になるかもしれません。

できれば変換元の文字種と文字列、
変換後の文字種なんかも教えて頂けると
(誰かが)何かしらアドバイスできるかもしれません。



たろう

リンク

2018/5/26(Sat) 18:28:43|NO.84501

すみません。説明不足でした。
現象:
長い文字列を変換するとある場所で突然切れてしまう。



たろう

リンク

2018/5/26(Sat) 19:15:21|NO.84502

補足:
>長い文字列を変換するとある場所で突然切れてしまう。
現象はutf-16以外をいじるときに発生します。
utf-16は扱うこともできません。変換しても何も出力されませんでした。



あらや

リンク

2018/5/26(Sat) 19:37:19|NO.84504

nkfcnvの説明をマニュアルから抜粋すると
>p3で、変換元の文字列サイズ(byte数)を指定します。p3を省略するかマイナス値の場合は、入力がC言語形式のansi文字列として自動計算されます。
>p4で、出力先のバッファサイズを指定します。このサイズを超えた変換は行なわれません。p4を省略するかマイナス値の場合は、デフォルトサイズ(32KB)が使用されます。

32KBは32768バイトですから、おおよそ途切れた位置と同じですね。

試しにnkfcnvで1MB(1048576バイト)のEUCファイルをSJISに変換してみたら
32774バイトで途切れ、最後の5バイトは文字化けでした。

この誤差はよくわかりませんがp3とp4をちゃんと1MB分指定してみると
ちゃんと変換及び表示できました。


UTF-16はいまいちわかりません。
nkfcnvで変換しても、encode.asで変換しても
どちらも妙な所に終端コードが入ってしまうようです。
cnvwtosが一番正確に変換できました。



たろう

リンク

2018/5/26(Sat) 21:08:50|NO.84507

p3とp4のパラメーターでできるのですね。
ありがとうございます!



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