ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 03:59

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - 同じ文字と判断されます。
作成者 メッセージ
  記事の件名:  VC++でも同様の症状が  引用付きで返信する
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 関数の「解説」を参照してください。
投稿記事 Posted: 2005年6月09日(木) 00:49
  記事の件名:  とりあえず...この方法で回避しています。  引用付きで返信する
他にコードの書き方はあるかもしれませんが...
とりあえず...以下の方法で回避しています。


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
投稿記事 Posted: 2005年6月08日(水) 02:10
  記事の件名:   引用付きで返信する
こちらでも検証しているのですが、困った事態になっています。というのも、下記のプログラムを実行すると、どうしても同一と判断されてしまうんです。先に、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日(水) 01:27
  記事の件名:  文字コードが原因?  引用付きで返信する
"々"の文字コードは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月07日(火) 21:44
  記事の件名:  同じ文字と判断されます。  引用付きで返信する
こんばんは、

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

Dim strMoji As String
 .
 .
 .

strMoji = "々"

Select Case strMoji

Case "ー"

'処理1

Case "々"

'処理2

End Select

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

ABのバージョン4.01.02
投稿記事 Posted: 2005年6月07日(火) 20:23

全ての表示時間は UTC+09:00 です


ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean