Delphi2010においてCharToElementIndexの結果が以下のようになります。
私はどちらも1が返されるものと思っていたのですが、何か考え違いを
しているのでしょうか…?
iElementIndex := CharToElementIndex('A', 1); → 0になる
iElementIndex := CharToElementIndex('AB', 1); → 1になる
エレメント数が1で、Indexも1だとこういう結果になるみたいですが
どういう概念でこうなるのかご教授願います。
なんかバグっぽいですね。
iElementIndex := CharToElementIndex(AnsiString('A'), 1); → 1になる
iElementIndex := CharToElementIndex(AnsiString('AB'), 1); → 1になる
AnsiString 版と挙動が異なるようです。
QC を上げてみますので、修正されるまでは
MECSUtils の MecsCharToElementIndex() をお使い下さい。
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
> MECSUtils の MecsCharToElementIndex() をお使い下さい。
...よく考えたら使えませんね。
MECSUtils のは、Index が "サロゲートペアを考慮した文字数 (コードポイント単位)" なので、
用途によっては不適切な場合があります。
何度もスミマセン。
> ...よく考えたら使えませんね。
SysUtils.CharToElementIndex() もサロゲートペアを考慮しますね。
勘違いしてました。
DEKO様
いろいろとありがとうございます。
なんか怪しいかなぁ…と思いつつ、不安になっておりました。
コードを追う気力がなかったのでテストプログラムで試してみたところ、
やはりエレメント数=1かつIndex=1の時におかしいようです。
エレメント数=2のサロゲートペアでは、正しく1が返されました。
当面は回避策を使わせていただきます。ありがとうございました。