Delphi 2007では、デフォルトのstring
タイプはAnsiString
です。 EmojisはUnicode処理を必要とします。最も一般的に使用されるAnsiエンコーディングには適合しない高Unicodeコードポイントを使用するためです。したがって、代わりにUnicode UTFエンコーディング(UTF-7、-8、-16、または-32)を使用する必要があります。
あなたがUTF-7 UTF-32用、またはUTF-8のUTF8String
、またはWideString
UTF-16、またはUCS4String
ためAnsiString
を使用することができます。
:UTF-7は、7ビットのASCII互換エンコードです。
:UTF8String
は(それはデルファイ6で導入されました)デルファイ2007年には存在しないが、それは真 UTF-8文字列型ではありません、それは常にそれを期待してAnsiString
のためだけの別名でありますUTF-8エンコードされたデータを保持します。 UTF-16経由で他のエンコーディングへの適切な変換を確実に行うには、UTF8Encode()
とUTF8Decode()
を使用する必要があります。 UTF8String
true Delphi 2009(UTF8Encode()
およびUTF8Decode()
も廃止予定)までのUTF-8文字列型になりませんでした。
:UCS4String
はDelphi 6以降も存在しますが、現代のDelphiのバージョンでも実際の文字列型ではありません。 array of UCS4Char
の別名です。
RTLには、UTF-7のネイティブサポートはありません(ただし、手動で実装するのは難しくありません)。また、UTF-32のサポートはほとんどありません(UTF-16 < - > UTF- 32)、コードにUTF-8またはUTF-16を貼り付ける必要があります。
WideString
をShowMessage()
に渡すなど、UTFデータをAnsiに変換すると、絵文字のデータが失われます。代わりにWideString
をWin32 API MessageBoxW()
関数に渡すことができます。ただし、データが失われることはありませんが、ダイアログで使用されるフォントによってEmojiが正しく表示される場合もあります(??
、少なくとも)。
しかし、Delphi 2007のネイティブRTLは、少なくともUTF-16ではなく、試行しているものをサポートしていません。 UTFを使用して、しかし
function WideReplaceStr(const S, FromText, ToText: WideString): WideString;
var
I: Integer;
begin
Result := S;
repeat
I := Pos(FromText, Result);
if I = 0 then Break;
Delete(Result, I, Length(FromText));
Insert(ToText, Result, I);
until False;
end;
var
s : WideString;
begin
s := 'This is my original string (y)';
s := WideReplaceStr(s, '(y)', '');
MessageBoxW(0, PWideChar(s), '', MB_OK);
end;
:あなたは、サードパーティWideString
ベースの機能を見つける必要があり、あるいは単にRTLの例WideString
データのために、オーバーロードされているPos()
、Delete()
、およびInsert()
組み込み関数を、使用して独自のを記述します-8、あなたはネイティブのRTLを使用して同じことを達成することができますが、あなたはまだShowMessage()
(まあ、あなたはできるが、それは正しく非ASCII文字は表示されません)を使用することはできません。
var
s : UTF8String;
begin
s := UTF8Encode('This is my original string (y)');
s := AnsiReplaceStr(s, '(y)', UTF8Encode(''));
MessageBoxW(0, PWideChar(UTF8Decode(s)), '', MB_OK);
end;
いずれかの方法をコードエディタがを保存するように設定されていることを確認してくださいUTF-8でファイル、リテラル''
を使用することはできませんそれ以外の場合は、あなたの代わりにもっとこのようなものを使用しなければならないでしょう:
var s: WideString;
...
s := WideReplaceStr(s, '(y)', Emoji);
または::
var
Emoji: WideString;
SetLength(Emoji, 2);
Emoji[1] := WideChar($D83D);
Emoji[2] := WideChar($DC4D);
その後、あなたはこれを行うことができます
var s: UTF8String;
...
s := AnsiReplaceStr(s, '(y)', UTF8Encode(Emoji));
@RemyLebeauありがとう。絵文字データを失うことなく仕事をすることができるansireplacestrに似た機能はありますか? – delphirules
@RemyLebeau私はこれらの機能を使ってみましたが、まだ絵文字を '???'で置き換えています。私はちょうどこの新しいアプローチで私の質問を編集しました。 – delphirules
返信に+6ポイントがあると、なぜ人々はマイナスで質問をマークするのか不思議に思った... – delphirules