CharToElementIndexの戻り値について

解決


せがばんだい  2010-03-31 23:18:06  No: 38159  IP: [192.*.*.*]

Delphi2010においてCharToElementIndexの結果が以下のようになります。
私はどちらも1が返されるものと思っていたのですが、何か考え違いを
しているのでしょうか…?

iElementIndex := CharToElementIndex('A', 1);   → 0になる
iElementIndex := CharToElementIndex('AB', 1);  → 1になる

エレメント数が1で、Indexも1だとこういう結果になるみたいですが
どういう概念でこうなるのかご教授願います。

編集 削除
DEKO  2010-04-01 06:34:10  No: 38160  IP: [192.*.*.*]

なんかバグっぽいですね。

iElementIndex := CharToElementIndex(AnsiString('A'), 1);   → 1になる
iElementIndex := CharToElementIndex(AnsiString('AB'), 1);  → 1になる

AnsiString 版と挙動が異なるようです。

QC を上げてみますので、修正されるまでは 
MECSUtils の MecsCharToElementIndex() をお使い下さい。

編集 削除
DEKO  2010-04-01 06:55:01  No: 38161  IP: [192.*.*.*]

QC 登録してみました。

Report No: 83508            Status: Reported
When the string length is 1 and index is 1, the UnicodeString version of CharToElementIndex() returns 0.
http://qc.embarcadero.com/wc/qcmain.aspx?d=83508
QCWIN:Defect_No=83508

# Vote をお願い致します m(_ _)m

編集 削除
DEKO  2010-04-01 06:59:11  No: 38162  IP: [192.*.*.*]

> MECSUtils の MecsCharToElementIndex() をお使い下さい。 
...よく考えたら使えませんね。

MECSUtils のは、Index が "サロゲートペアを考慮した文字数 (コードポイント単位)" なので、
用途によっては不適切な場合があります。

編集 削除
DEKO  2010-04-01 07:03:44  No: 38163  IP: [192.*.*.*]

何度もスミマセン。

> ...よく考えたら使えませんね。
SysUtils.CharToElementIndex() もサロゲートペアを考慮しますね。
勘違いしてました。

編集 削除
せがばんだい  2010-04-01 15:02:47  No: 38164  IP: [192.*.*.*]

DEKO様

いろいろとありがとうございます。
なんか怪しいかなぁ…と思いつつ、不安になっておりました。
コードを追う気力がなかったのでテストプログラムで試してみたところ、
やはりエレメント数=1かつIndex=1の時におかしいようです。
エレメント数=2のサロゲートペアでは、正しく1が返されました。

当面は回避策を使わせていただきます。ありがとうございました。

編集 削除