同じ文字と判断されます。

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 同じ文字と判断されます。

VC++でも同様の症状が

by Sinryow » 2005年6月09日(木) 00:49

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 関数の「解説」を参照してください。

とりあえず...この方法で回避しています。

by M.K » 2005年6月08日(水) 02:10

他にコードの書き方はあるかもしれませんが...
とりあえず...以下の方法で回避しています。


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

by 山本 » 2005年6月08日(水) 01:27

こちらでも検証しているのですが、困った事態になっています。というのも、下記のプログラムを実行すると、どうしても同一と判断されてしまうんです。先に、IfやSelectなどの文字列比較はCompareString(lstrcmpと同じ系列)を呼び出すことで実現しているということを言っておきます。

コード: 全て選択

#N88BASIC
Print lstrcmp("々","ー")
Print lstrcmp("々","―")
こちら、どう見てもバイトコードが違うんで、異なった結果として処理されなければならないと思うんですが、どうもlstrcmpのそれ自体がおかしな計算をしているんでしょうか…。CompareStringに変えて試してみましたが、こちらも同じ結果となってしまいました。

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

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

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

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

Else
End If

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

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

文字コードが原因?

by 7 » 2005年6月07日(火) 21:44

"々"の文字コードは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"がペアステートメントで表示されないんですが、これは表示しないってことで良いんでしょうか?

同じ文字と判断されます。

by M.K » 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

ページトップ