[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ラテン拡張文字の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
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.