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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1020
男子中学生文字列の一番右の文字を消す方法10解決


男子中学生

リンク

2014/10/20(Mon) 20:13:11|NO.65641

こんばんは
文字列の文字を消す方法が良くわからないので質問させてもらいます。


txt="ABCDEF" last_byte="" last_byte=strmid(txt,-1,1) mes last_byte b=strtrim (txt,3,''+last_byte) mes b

文字列型変数txtに代入された文字列「ABCDEF」の
一番右にある「F」を文字列から消し、"ABCDE"という用にしたく、
文字列操作関係の命令のサンプルをみながら上のスクリプトを書いてみましたが、
実行しても"ABCDE"にならないです。

txtの最後の文字である「F」をstrmidで取り出す(文字列型変数last_byteに代入)
 (ここはうまくできているはずです)
strtrimで文字列型変数bにtxtからlast_byte(「F」)を取り除いた
 「ABCDE」を代入、という用になるように記述しましたがうまくできませんでした。

原因がわかる人がいましたら、教えていただければうれしいです。



この記事に返信する


たんす

リンク

2014/10/20(Mon) 20:25:59|NO.65643

last_byteが文字列型だからですね。
peekを使って文字コードにしてください。
txt="ABCDEF"
last_byte="" last_byte=strmid(txt,-1,1) mes last_byte b=strtrim (txt,3,''+last_byte) mes b last_code=peek(last_byte,0) //文字コードにする c=strtrim (txt,3,last_code) mes c



zero

リンク

2014/10/20(Mon) 20:35:36|NO.65644

単純に 文字列の末尾の1文字を消したいのであれば、
全ての文字が1バイト文字(半角文字)だと分かっていれば
その位置にヌル文字を書き込むというワザもあります。

txt = "ABCDEF" poke txt, strlen(txt)-1, 0 mes txt



男子中学生

リンク

2014/10/20(Mon) 21:01:57|NO.65645

>>たんす さん

>>last_byteが文字列型だからですね。
>>peekを使って文字コードにしてください。

いったん数値(文字コード)化してそれを入れないとだめだったんですね。
よく見たら、リファレンスにも文字列ではなく文字コードを入れろ、と
書いてありました・・・。
文字を取得して文字コード化、最後に文字コードから指定して文字を削除、
という手順を覚えられるようにしたいです!

>>zero さん

>>単純に 文字列の末尾の1文字を消したいのであれば、
>>全ての文字が1バイト文字(半角文字)だと分かっていれば
>>その位置にヌル文字を書き込むというワザもあります。

リファレンスと「ヌル文字」で検索して提示していただいたサンプルの
意味がわかりました!

6文字目の「F」をヌル文字に書き換えることで、
Fを消すことができるんですね。

-1を-2にすれば全角も消せるし、-4にすれば以降の4byte分の文字を
ヌル文字によって消せるのは便利ですね。



おかげで原因がわかりました、ご解答ありがとうございました!



ZAP

リンク

2014/10/20(Mon) 21:36:08|NO.65646

strlenを使って文字列の長さを取得すればもっと単純にできます


txt="ABCDEF" b=strmid(txt,0,strlen(txt)-1) mes b



男子中学生

リンク

2014/10/20(Mon) 22:15:27|NO.65649

>>ZAP さん

たしかに、必要な部分だけとれば、簡単にできますね。
「消す」じゃなくて「取り出す」方法もあるんですね
参考になりました!



skyblue

リンク

2014/10/21(Tue) 07:26:16|NO.65657

ヌルではなくてスペースと言うのいうのもあります。



男子中学生

リンク

2014/10/27(Mon) 17:08:11|NO.65769

すみません、また問題が出てきたのでここで再度
質問をさせてもらいます。


txt="ABあ" mes "txt="+txt last_byte=strmid(txt,-1,1) //このstrtmidのp3が1で、文字が2byteあると、 //1byte分しか取得せず、最終的に文字がおかしくなります。 mes "last_byte="+last_byte last_code=peek(last_byte,0) mes "last_code="+last_code txt=strtrim(txt,2,''+last_code) mes txt

↑のtxtのような、1byteの文字と2byteの文字の混ざった文字列で、
"あ"のような2byteの文字を1byteとして取得し、取り除くと
文字がおかしくなります><


そこで質問なのですが、
一番右の文字が2byte文字と1byte文字かを判別するにはどうすればよいのか
教えてくれませんか。



男子中学生

リンク

2014/10/27(Mon) 19:18:21|NO.65772

>>zeroさん

文字列の操作の命令をリファレンスなどでみたんですが。

1文字=1byteとしてみなすものしかなかったので
今回の2バイト文字・1バイト文字の判別ができませんでしたが、

IsDBCSLeadByte関数というものを利用すればできたんですね!

これからは、標準の命令だけだはなく、
関数も視野に入れて調べてわかるようにしたいです。


どうもありがとうございました^o^ノ



掘木

リンク

2014/10/27(Mon) 23:21:36|NO.65773

>>zeroさん
あくまでもIsDBCSLeadByteの返り値は2バイト文字の先行バイトの可能性を示す値ですよ。

1.txtの内容が"らA"のように、
2バイト文字の後続バイトが、先行バイトの可能性があるものだと上手く機能しません。
("らA"を入れると末端文字が"蹉"と出ます。)

2.txtの内容が2バイト以上あることを前提にしている。

通常、前から順番に見て解決していくようです。

#include "kernel32.as" txt="らA" mes "txt="+txt lastseek = 0 repeat strlen(txt) lastseek = cnt IsDBCSLeadByte peek(txt,cnt) if (stat) { continue cnt+2 } loop mes "一番右の文字は「" + strmid(txt,lastseek,2) + "」"
一度unicodeに変換して末端1ワード削ってSJISに戻す手もありますが・・・。



zero

リンク

2014/10/27(Mon) 23:35:25|NO.65774

>>掘木さん
ご指摘のとおりです。その可能性をすっかり忘れておりました。
誤ったことを書いてしまい、申し訳ありませんでした。



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