文字列の扱いについて教えて

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

文字列の扱いについて教えて

#1 投稿記事 by マティ »

文字列を扱う関数のヘルプを見ていると、文字位置で指定するように記載がありますが、/basic/function.sbpの定義を見ていると、
バイト単位で指定を行っているように思われます。

標準関数では、漢字(2バイト系)の処理はどのようになっているのでしょうか?
基本的に、各個人で実装しているのでしょうか?
お教え下さい。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

たしか、文字列関係の関数はどれも実際にはバイト数で指定するものだったと思います。
2バイト文字には特別な対応をしておらず、要注意です。

コード: 全て選択

#prompt
#strict
Print InStr(1, "あ\", "\")
Print InStr(1, "表\", "\")
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#3 投稿記事 by マティ »

自分で実装する必要があるって事ですね!

ActiveBasicで使用する漢字コードはSJISですよね!
もしかして、どのような漢字コードが来ても対応出来るようにバイト単位の
処理しか実装していないのでしょうか?

もし、SJIS専用の関数を実装するならどのように命名したほうがよいでしょうか?
実装を予定している関数は
Left$(),Right$(),Mid$(),TRim$,LRim()$,RRim$(),InStr()
です。

どなたかアドバイス願います。
河川屋

#4 投稿記事 by 河川屋 »

>SJIS専用の関数を実装するならどのように命名したほうがよいでしょうか?
>実装を予定している関数は
>Left$(),Right$(),Mid$(),TRim$,LRim()$,RRim$(),InStr()
あと1つ、Len()があります。
N88Basicには、KMID$,KLEN$,KINSTRという漢字を1字として数えるための関数があります。
というわけで、これも、N88BASIC非互換の1つです。

ただ、非互換について一応弁護しておくと、
N88BASIC(DiskBasic)の頃の漢字の扱いは、今のMIME上の取り扱いと似ていて、
"123漢字456"という文字は、
"123"+<KI>+"漢字"+<KO>+"456"   ※漢字はJISコード
というように、全角半角切替えコードで切り替えていたため、
LEN("123漢字456")では10という値でなく切り替えコードを足した値
が返ってしまう、という決定的な不都合があったため、
・2バイト系文字操作命令が無いと漢字は事実上扱えなかった
という現実があったのですが、
SJISなら、切り替えコードに比べれば2バイト操作は無くても困らないです。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#5 投稿記事 by イグトランス »

AB2で良ければKMid$,KLen$,KInstrなどといった関数もあります。
というわけでAB2を使うことを考えてみるのも同でしょうか。
(K~関数群を作るのも大した手間ではないでしょうけど)
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

#6 投稿記事 by Sinryow »

私のところで,2バイト文字も1文字として扱うライブラリを公開しています。
http://ab.sinryow.net/charbase.php
参考にして下さい。

他にも同じようなライブラリを公開している方がいたような気がしましたが,忘れました・・・。

あと,2バイト文字も1文字として扱う必要性が頻繁にあるのでしたら,文字をUnicodeに変換するのも一手かもしれません。
(ABではUnicodeは結構使いにくいですが・・・)
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#7 投稿記事 by マティ »

Sinryowさん、2バイト文字の判定方法は大体同じですね!1バイト目が(80-9F,E0-FF)を漢字とみなす

Sinryowさんのコード

コード: 全て選択


Function Upper2Byte(char As Byte) As Long
	Upper2Byte=((char And &H80)=&H80 And (char And &H40)=((char And &H20)<<1))
End Function
自分のコード

コード: 全て選択


Function Upper2Byte(char As Byte) As Long
	Upper2Byte=((((char>>1) Xor char) And &hA0) = &h80)
End Function
あと、Unicodeについてですが・・・
SJISで定義したDB(MySQL,Firebird,MSDN)にCSVデータを転送する処理をVB+ADOで作成済みですが・・・
どうも文字コード変換処理がネックになっているようで、自分が満足出来る性能が出せないのです。
(DBとCSV(27万件)を比較し変更のあったデータのみ、履歴を作成して登録します。毎日実行するので1秒でも早く処理が終わってほしいので、ABを使う気になりました。)
余分な余白はDBにセットしないので、文字列処理関数を作成する必要があるなって思っています。
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#8 投稿記事 by マティ »

文字列処理(KLen$,KLeft$,KRight$,KMid$,KTrim$,KLTrim$,KRTrim$,KInStr)の実装ができました。
ついでに呼び出し側で確保した領域にデータを渡す処理を作成したいと思います。

そこでパラメータ指定順をC言語互換にしたいと思いますので、どなたかお教え下さい。

実装予定関数名
KLenEx
KLeftEx
KRightEx
KMidEx
KTrimEx
KLTrimEx
KRTrimEx
KInStrEx

現在作成分はホームページにて公開中。
全関数が揃ったら実践コードモジュールに投稿したいな・・・!
返信する