ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2018年11月22日(木) 03:07

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年6月07日(火) 20:23 
こんばんは、

以下の条件判断で、"々"と"ー"が「同じ文字」と判断されるようです。

Dim strMoji As String
 .
 .
 .

strMoji = "々"

Select Case strMoji

Case "ー"

'処理1

Case "々"

'処理2

End Select

※strMojiが"々"の場合、"ー"内の「処理1」が実行されます。
調査お願いいたします。

ABのバージョン4.01.02


通報する
ページトップ
   
 記事の件名: 文字コードが原因?
投稿記事Posted: 2005年6月07日(火) 21:44 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
住所: 新潟県
"々"の文字コードは129,88の2バイトで、"ー"の文字コードは129,91の2バイトで、Case文で先に先頭の文字コードが一致した部分のコードが実行されるようです。
※意味不明…?
コード:
str="々"
Select Case str
	Case "ー"
		'こっちが実行される

	Case "々"
End Select

str="ー"
Select Case str
	Case "々"
		'こっちが実行される

	Case "ー"
End Select
それとIf文も同様でした。
コード:
str="々"
If str="ー" Then
	'こっちが実行される

ElseIf str="々" Then
End If

str="ー"
If str="々" Then
	'こっちが実行される

ElseIf str="ー" Then
End If
そういえば、If文の"ElseIf"がペアステートメントで表示されないんですが、これは表示しないってことで良いんでしょうか?


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年6月08日(水) 01:27 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
こちらでも検証しているのですが、困った事態になっています。というのも、下記のプログラムを実行すると、どうしても同一と判断されてしまうんです。先に、IfやSelectなどの文字列比較はCompareString(lstrcmpと同じ系列)を呼び出すことで実現しているということを言っておきます。
コード:
#N88BASIC
Print lstrcmp("々","ー")
Print lstrcmp("々","―")
こちら、どう見てもバイトコードが違うんで、異なった結果として処理されなければならないと思うんですが、どうもlstrcmpのそれ自体がおかしな計算をしているんでしょうか…。CompareStringに変えて試してみましたが、こちらも同じ結果となってしまいました。

ABのほかに、VCでも同様の検証を行ったのですが、lstrcmp及びCompareStringは同じように間違った答えが返りました(strcmpやmemcmpでは予想通り、「異なる」という値が返りました)。

"々","ー","―"がそれぞれ同じと扱われては困るので、もう少し検証してみます。余談ですが、どうも最近文字コードの不具合によく遭遇します…(何故だ!?)

引用:
そういえば、If文の"ElseIf"がペアステートメントで表示されないんですが、これは表示しないってことで良いんでしょうか?
Else
ElseIf
End If

というように補完機能をだすと、見辛くなるような気がしたので、あえて

Else
End If

のみの表示にしています(個人的な視点から見たものではありますが…)。Elseを補完した後に"If"と打ち込むだけなので、キーボード操作の回数は大差ないという解釈をしたのも理由の一つです。更に付け加えると、プログラムコードによりますが、"ElseIf" の出現率は、"Else" 及び "End If" と比べると低いものだと思います(これも私の経験上の話です…)。

これらの観点から、ElseIfを補完非表示に設定しておりますので、ご了承いただければ幸いです。


通報する
ページトップ
投稿記事Posted: 2005年6月08日(水) 02:10 
オフライン

登録日時: 2005年6月07日(火) 22:06
記事: 18
住所: 長崎県
他にコードの書き方はあるかもしれませんが...
とりあえず...以下の方法で回避しています。


Dim ch[1] As Byte '2バイト分確保
Dim strChar As String

strChar = "ー"

Select Case strChar

Case "々","ー"

lstrcpy(VarPtr(ch[0]),strChar)

If ch[1] = &h58 Then '「々」の場合

'~処理1~


Else '「ー」の場合


'~処理2~

End If

Case ~....'その他の条件

End Select


通報する
ページトップ
 記事の件名: VC++でも同様の症状が
投稿記事Posted: 2005年6月09日(木) 00:49 
オフライン

登録日時: 2005年5月31日(火) 09:34
記事: 141
住所: 北海道
Visual C++(VS.NET,ただし.NETではなく通常のWin32としてコンパイル)
を使っても
コード:
int main(void){
	printf("%d\n", lstrcmp("々", "ー"));
	printf("%d\n", lstrcmp("々", "―"));
	getchar(); // 終了を待機
	return 0;
}
の結果は「0」と出ました。

↓のことがひょっとしたら原因かもしれません。分かりませんが・・・
引用:
(http://www.microsoft.com/japan/msdn/lib ... strcmp.asp より)

Win32 の lstrcmp 関数は、「文字列ソート」ではなく「単語ソート」に基づいて文字列を比較します。「単語ソート」では、ハイフン(-)とアポストロフィ(')を、英数字以外のその他の記号とは異なった方法で扱い、並べ替え後のリストで、coop と co-op が隣接する位置にあるものとして扱います。16 ビット版の Windows の lstrcmp 関数が、「文字列ソート」に基づいて文字列を比較していたことに注意してください。単語ソートと文字列ソートの説明については、CompareString 関数の「解説」を参照してください。

_________________
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke