こんばんは、
以下の条件判断で、"々"と"ー"が「同じ文字」と判断されるようです。
Dim strMoji As String
.
.
.
strMoji = "々"
Select Case strMoji
Case "ー"
'処理1
Case "々"
'処理2
End Select
※strMojiが"々"の場合、"ー"内の「処理1」が実行されます。
調査お願いいたします。
ABのバージョン4.01.02
同じ文字と判断されます。
-
- 記事: 473
- 登録日時: 2005年5月31日(火) 18:51
- お住まい: 新潟県
文字コードが原因?
"々"の文字コードは129,88の2バイトで、"ー"の文字コードは129,91の2バイトで、Case文で先に先頭の文字コードが一致した部分のコードが実行されるようです。
※意味不明…?
それとIf文も同様でした。
そういえば、If文の"ElseIf"がペアステートメントで表示されないんですが、これは表示しないってことで良いんでしょうか?
※意味不明…?
コード: 全て選択
str="々"
Select Case str
Case "ー"
'こっちが実行される
Case "々"
End Select
str="ー"
Select Case str
Case "々"
'こっちが実行される
Case "ー"
End Select
コード: 全て選択
str="々"
If str="ー" Then
'こっちが実行される
ElseIf str="々" Then
End If
str="ー"
If str="々" Then
'こっちが実行される
ElseIf str="ー" Then
End If
-
- Site Admin
- 記事: 535
- 登録日時: 2005年5月30日(月) 15:08
こちらでも検証しているのですが、困った事態になっています。というのも、下記のプログラムを実行すると、どうしても同一と判断されてしまうんです。先に、IfやSelectなどの文字列比較はCompareString(lstrcmpと同じ系列)を呼び出すことで実現しているということを言っておきます。
こちら、どう見てもバイトコードが違うんで、異なった結果として処理されなければならないと思うんですが、どうもlstrcmpのそれ自体がおかしな計算をしているんでしょうか…。CompareStringに変えて試してみましたが、こちらも同じ結果となってしまいました。
ABのほかに、VCでも同様の検証を行ったのですが、lstrcmp及びCompareStringは同じように間違った答えが返りました(strcmpやmemcmpでは予想通り、「異なる」という値が返りました)。
"々","ー","―"がそれぞれ同じと扱われては困るので、もう少し検証してみます。余談ですが、どうも最近文字コードの不具合によく遭遇します…(何故だ!?)
ElseIf
End If
というように補完機能をだすと、見辛くなるような気がしたので、あえて
Else
End If
のみの表示にしています(個人的な視点から見たものではありますが…)。Elseを補完した後に"If"と打ち込むだけなので、キーボード操作の回数は大差ないという解釈をしたのも理由の一つです。更に付け加えると、プログラムコードによりますが、"ElseIf" の出現率は、"Else" 及び "End If" と比べると低いものだと思います(これも私の経験上の話です…)。
これらの観点から、ElseIfを補完非表示に設定しておりますので、ご了承いただければ幸いです。
コード: 全て選択
#N88BASIC
Print lstrcmp("々","ー")
Print lstrcmp("々","―")
ABのほかに、VCでも同様の検証を行ったのですが、lstrcmp及びCompareStringは同じように間違った答えが返りました(strcmpやmemcmpでは予想通り、「異なる」という値が返りました)。
"々","ー","―"がそれぞれ同じと扱われては困るので、もう少し検証してみます。余談ですが、どうも最近文字コードの不具合によく遭遇します…(何故だ!?)
Else7 さんが書きました:そういえば、If文の"ElseIf"がペアステートメントで表示されないんですが、これは表示しないってことで良いんでしょうか?
ElseIf
End If
というように補完機能をだすと、見辛くなるような気がしたので、あえて
Else
End If
のみの表示にしています(個人的な視点から見たものではありますが…)。Elseを補完した後に"If"と打ち込むだけなので、キーボード操作の回数は大差ないという解釈をしたのも理由の一つです。更に付け加えると、プログラムコードによりますが、"ElseIf" の出現率は、"Else" 及び "End If" と比べると低いものだと思います(これも私の経験上の話です…)。
これらの観点から、ElseIfを補完非表示に設定しておりますので、ご了承いただければ幸いです。
-
- 記事: 18
- 登録日時: 2005年6月07日(火) 22:06
- お住まい: 長崎県
とりあえず...この方法で回避しています。
他にコードの書き方はあるかもしれませんが...
とりあえず...以下の方法で回避しています。
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
とりあえず...以下の方法で回避しています。
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
-
- 記事: 141
- 登録日時: 2005年5月31日(火) 09:34
- お住まい: 北海道
VC++でも同様の症状が
Visual C++(VS.NET,ただし.NETではなく通常のWin32としてコンパイル)
を使っても
の結果は「0」と出ました。
↓のことがひょっとしたら原因かもしれません。分かりませんが・・・
を使っても
コード: 全て選択
int main(void){
printf("%d\n", lstrcmp("々", "ー"));
printf("%d\n", lstrcmp("々", "―"));
getchar(); // 終了を待機
return 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/
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================