[[20090706172029]] 『ラテン拡張文字のInStr()の戻り値が異なる理由』(Cabin) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ラテン拡張文字のInStr()の戻り値が異なる理由』(Cabin)
初めまして。解決方法の質問ではなく動作理由の質問ですが、ご存じの方がいらっしゃいましたら、宜しくお願いいたします。

Excel2000/2003(OSはWinXP)のInStr()でラテン拡張文字0x0130, 0x01ae, 0x01b5がvbTextCompareでは2桁、vbBinaryCompareでは1桁になってしまいます(コードはUTF16です)。

  例)
    Dim posT, posB as Integer
    posT = InStr(1, "検索文字列", "%", vbTextCompare)
    posB = InStr(1, "検索文字列", "%", vbBinaryCompare)

    ※検索文字列が"abcdefghİ%"の場合に、
        posT = 11
        posB = 10
      となります(İが、文字コード0x0130です)

その他の文字0x0020〜0x0200範囲は1文字1桁なのは確認済みです。

※逆の例ですが、「ゔ」(0x3094)と「ヷ」(0x30F7)「ヸ」(0x30F8)「ヹ」(0x30F9)「ヺ」(0x30FA)を組み合わせると、vbTextCompareでは1桁少なくなるようです。

  例)
    Dim posT, posB as Integer
    posT = InStr(1, "ゔヷ%", "%", vbTextCompare)
    posB = InStr(1, "ゔヷ%", "%", vbBinaryCompare)
        posT = 3
        posB = 2
    ※「ゔ」の羅列では正しい値で、組み合わせた時だけおかしくなります
      又いくつ組み合わせても-1です
    posT = InStr(1, "ゔゔ%", "%", vbTextCompare)
        posT = 3

vbBinaryCompareを使用すれば正しい値が求められるのは判っているのですが、vbTextCompareでNGの理由が判らないのです。

理由をご存じの方がおられましたら、宜しくお願いいたします。

ーーーー

(Cabin)です。2番目の例)が間違っていました。

    posT = 2
    posB = 3
です。申しわけありません。


 Excelは、Jisコード
 VBAは、S-JISコ-ド
 Windowsは、Unicode

 というコード体系が起こすトラブルでしょうねえ!!

 提示された

 ラテン拡張文字 İ 0x0130や
 「ゔ」(0x3094)と「ヷ」(0x30F7)「ヸ」(0x30F8)「ヹ」(0x30F9)「ヺ」(0x30FA)

 のなかでS-JISコードに変換可能(ヴになるが)なのは、「ゔ」(0x3094)これだけなんですよね?
 他は、変換コードがないですね!!これが起因していそうですが・・・。
 もっともそのメカニズムはわかりませんが・・・。

 因みにワークシート関数のSearch(Helpによると内部ではvbTextCompareしている)では、
 投稿例だと正しい値が得られています。

 ichinose


ichinose 様
回答ありがとうございます。
 Excelは、Jisコード
 VBAは、S-JISコ-ド
 Windowsは、Unicode
ってのは初めて知りました。

 Unicodeの場合、合成文字で処理している場合があるのでそこら辺もあるのかもしれないです。
 "abcd=%1234"のような文字列で"%"の位置を調べ、"%"以降の文字列を内部で処理するのが本来の目的でした。 
 ACCESSでも濁音の連続で桁数を間違える例がMSのHPにありますので、何も考えず"vbBinaryCompare"を使うようにした方がいいみたいですね。 
(MSに聞いても、そう言われそう・・・)

Cabin


補足&修正
 >その他の文字0x0020〜0x0200範囲は1文字1桁なのは確認済みです。
 と、書きましたが。間違ってまして、İ(0x0130)の他にƮ(0x1ae)、Ƶ(0x01b5)も2桁です。
     Ʈ(0x1ae)---Latin capital letter T with retroflex hook
     Ƶ(0x01b5)--Latin capital letter Z with stroke

 0x00A0〜0x0200のラテン補助/拡張A/拡張Bは、JISやS-JISに割り振られて無い文字の方が多いです。
 その中で、上記3個だけ"vbTextCompare"で2桁になるのは、やはりVBAの不具合でしょうか。

 P.S.Excel2007でも同じ結果でした(OSはXP)

Cabin


 >0x00A0〜0x0200のラテン補助/拡張A/拡張Bは、JISやS-JISに割り振られて無い文字の方が多いです。
 >その中で、上記3個だけ"vbTextCompare"で2桁になるのは、やはりVBAの不具合でしょうか。

 ふーん、だとすると一概に「コード体系が起こすトラブル」とは言えませんね!!

 >何も考えず"vbBinaryCompare"を使うようにした方がいいみたいですね。 
 vbBinaryCompareで事足りのならこれで良いですが、a=Aと見なすvbTextCompareも必要ですよね!!
 前投稿でも記述しましたが、

 Sub test()
    Range("a1:a2").Value = ""
    Range("a1").Value = "abcdefgh" & ChrW(&H130) & "%"
    MsgBox "確認"
    MsgBox WorksheetFunction.Search("%", "abcdefgh" & ChrW(&H130) & "%")
    Range("a2").Value = ChrW(&H3094) & ChrW(&H30F7) & "%"
    MsgBox "確認"
    MsgBox WorksheetFunction.Search("%", ChrW(&H3094) & ChrW(&H30F7) & "%")
 End Sub

 ワークシート関数のSearchを使うと正しく得られますね!!

 ichinose


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.