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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0812
ゆうやん(旧ゆー)ひらがなからカタカナに変換6解決


ゆうやん(旧ゆー)

リンク

2018/8/12(Sun) 22:36:27|NO.85048

ひらがなからカタカナに変換にするプログラムを作ってみたのですが、「アイウエオ」のところまで切れてしまいます。
なぜでしょうか?

#include "hsp3utf.as" #module #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 #global hiragana="あいうえお漢字かきくけこ" cnvstow hiragana,hiragana;UTF-8からUTF-16に変換 sdim b;これがないとバッファオーバーフローにになる。 repeat strlen_utf16w(hiragana) checkhiragana=wpeek(hiragana,cnt*2) ;ifで文字がひらがなかどうか判別 if(checkhiragana>=0x3041)&(checkhiragana<=0x3096):wpoke b,cnt*2,checkhiragana+0x60;0x60を足すことでカタカナになる。 loop katakana=cnvwtos(b);UTF-16からUTF-8に変換 mes katakana



この記事に返信する


ソラ

リンク

2018/8/12(Sun) 23:04:34|NO.85049

そのソースコードだとひらがな以外はbに入らず空白になるので、
そこで文字列が終了したと判断されてしまいます。
なのでifの最後に

:else:wpoke b,cnt*2,checkhiragana
を入れれば動くと思いますよ。



ソラ

リンク

2018/8/12(Sun) 23:07:03|NO.85050

さらに言うと、sdim bだけでは64Byte分しか確保されないので、32文字でオーバーフローします。
従って以下のようにしたほうがいいかと思います。

sdim b,strlen_utf16w(hiragana)*2;これがないとバッファオーバーフローになる。



ゆうやん(旧ゆー)

リンク

2018/8/14(Tue) 08:09:04|NO.85069

ソラさん ありがとうございます。
25文字以上だと、なぜか文字化けしてしまいます。
どこを修正すれば直りますか?

#include "hsp3utf.as" #module #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 #global hiragana="あいうえお\nかきくけこ\nさしすせそ\nたちつてと\nなにぬねの\nはひふへほ\nまみむめも" cnvstow hiragana,hiragana;UTF-8からUTF-16に変換 sdim b,strlen_utf16w(hiragana)*2;これがないとバッファオーバーフローになる。 repeat strlen_utf16w(hiragana) checkhiragana=wpeek(hiragana,cnt*2) ;ifで文字がひらがなかどうか判別 if(checkhiragana>=0x3041)&(checkhiragana<=0x3096){ wpoke b,cnt*2,checkhiragana+0x60;0x60を足すことでカタカナになる。 }else{ wpoke b,cnt*2,checkhiragana } loop katakana=cnvwtos(b);UTF-16からUTF-8に変換 mes katakana



あらや

リンク

2018/8/15(Wed) 17:18:11|NO.85083

>25文字以上だと、なぜか文字化けしてしまいます。
正確には 語尾に文字化けしたような文字列が付く ということですね。

>sdim b,strlen_utf16w(hiragana)*2;これがないとバッファオーバーフローになる。

この行ですが、文字数ピッタリのメモリしか確保していない為
文字列の終端コードを入れる余裕が無くなり
メモリ上の余計な数値まで読み取ってそれを文字として変換してしまうのでしょう。

sdim b,strlen_utf16w(hiragana)*2 + 1; 語尾を終端コードにするため多めにメモリ確保

これで余計な物が付かなくなるはずですが、UTF16の性質上
+1ではなく+2にした方が誤変換の可能性が減って安定するかもしれません。



ソラ

リンク

2018/8/15(Wed) 18:46:31|NO.85085

お二人ともごめんなさい、終端コードのことは忘れていました。



ゆうやん

リンク

2018/8/18(Sat) 08:02:17|NO.85114

あらやさん、sdimのデフォルト文字数を変えたら正しく表示されました。
ありがとうございます。
解決です。



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