ab.com コミュニティ https://www.activebasic.com/forum/ |
|
同じ文字と判断されます。 https://www.activebasic.com/forum/viewtopic.php?t=83 |
ページ 1 / 1 |
作成者: | 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 |
作成者: | 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"がペアステートメントで表示されないんですが、これは表示しないってことで良いんでしょうか? |
作成者: | 山本 [ 2005年6月08日(水) 01:27 ] |
記事の件名: | |
こちらでも検証しているのですが、困った事態になっています。というのも、下記のプログラムを実行すると、どうしても同一と判断されてしまうんです。先に、IfやSelectなどの文字列比較はCompareString(lstrcmpと同じ系列)を呼び出すことで実現しているということを言っておきます。 コード: #N88BASIC Print lstrcmp("々","ー") Print lstrcmp("々","―")こちら、どう見てもバイトコードが違うんで、異なった結果として処理されなければならないと思うんですが、どうもlstrcmpのそれ自体がおかしな計算をしているんでしょうか…。CompareStringに変えて試してみましたが、こちらも同じ結果となってしまいました。 ABのほかに、VCでも同様の検証を行ったのですが、lstrcmp及びCompareStringは同じように間違った答えが返りました(strcmpやmemcmpでは予想通り、「異なる」という値が返りました)。 "々","ー","―"がそれぞれ同じと扱われては困るので、もう少し検証してみます。余談ですが、どうも最近文字コードの不具合によく遭遇します…(何故だ!?) 引用: そういえば、If文の"ElseIf"がペアステートメントで表示されないんですが、これは表示しないってことで良いんでしょうか?
ElseElseIf End If というように補完機能をだすと、見辛くなるような気がしたので、あえて Else End If のみの表示にしています(個人的な視点から見たものではありますが…)。Elseを補完した後に"If"と打ち込むだけなので、キーボード操作の回数は大差ないという解釈をしたのも理由の一つです。更に付け加えると、プログラムコードによりますが、"ElseIf" の出現率は、"Else" 及び "End If" と比べると低いものだと思います(これも私の経験上の話です…)。 これらの観点から、ElseIfを補完非表示に設定しておりますので、ご了承いただければ幸いです。 |
作成者: | 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 |
作成者: | Sinryow [ 2005年6月09日(木) 00:49 ] |
記事の件名: | 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 関数の「解説」を参照してください。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |