UTF8 descriptionを使用してUTF8文字列を自分で解析する必要があります。私はByteToCharIndex
の迅速なUTF8アナログを書かれており、キリル文字列にテストした:
function UTF8PosToCharIndex(const S: UTF8String; Index: Integer): Integer;
var
I: Integer;
P: PAnsiChar;
begin
Result:= 0;
if (Index <= 0) or (Index > Length(S)) then Exit;
I:= 1;
P:= PAnsiChar(S);
while I <= Index do begin
if Ord(P^) and $C0 <> $80 then Inc(Result);
Inc(I);
Inc(P);
end;
end;
const TestStr: UTF8String = 'abФЫВА';
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(IntToStr(UTF8PosToCharIndex(TestStr, 1))); // a = 1
ShowMessage(IntToStr(UTF8PosToCharIndex(TestStr, 2))); // b = 2
ShowMessage(IntToStr(UTF8PosToCharIndex(TestStr, 3))); // Ф = 3
ShowMessage(IntToStr(UTF8PosToCharIndex(TestStr, 5))); // Ы = 4
ShowMessage(IntToStr(UTF8PosToCharIndex(TestStr, 7))); // В = 5
end;
逆関数はあまりにも問題ありません:
function CharIndexToUTF8Pos(const S: UTF8String; Index: Integer): Integer;
var
P: PAnsiChar;
begin
Result:= 0;
P:= PAnsiChar(S);
while (Result < Length(S)) and (Index > 0) do begin
Inc(Result);
if Ord(P^) and $C0 <> $80 then Dec(Index);
Inc(P);
end;
if Index <> 0 then Result:= 0; // char index not found
end;
あなたはdoesnのByteToCharIndexてください。仕事は?ドキュメントのテキストがAnsiStringが独自のコードページを運ぶように変更されたDelphi 2009より前のものであれば、私は驚くことはありません。 AnsiStringにコードページが含まれているので、システム設定に依存する代わりに、文字列がMBCS、SBCS、またはUTF-8としてエンコードされているかどうかを知ることができるはずです。 –
@RobKennedy - 動作しません。それ以上の場合、Windows関数 'CharNextExA'もUTF8では動作しません。 – kludg
はい、Sergが確認したように動作しません。私も試しました。 –