CharToElementIndexの戻り値について

解決


せがばんだい  2010-04-01 08:18:06  No: 38159

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

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

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


DEKO  2010-04-01 15:34:10  No: 38160

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

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

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

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


DEKO  2010-04-01 15:55:01  No: 38161

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 15:59:11  No: 38162

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

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


DEKO  2010-04-01 16:03:44  No: 38163

何度もスミマセン。

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


せがばんだい  2010-04-02 00:02:47  No: 38164

DEKO様

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加