2017-03-28 3 views
-1

は、デルファイ2007年に、文字列の中に絵文字を挿入し、Delphiで文字列内の絵文字を挿入絵文字をIDEのコードに貼り付けるが、実行時のshowmessageの結果は次のようになります。ちょうど下の例のように、2007年、私はまさにタイトルの言うことをやろうとしている

これは私の元の文字列ですか?

Delphi 2007でこのタスクを達成する方法はありますか?いくつかの理由のため、私は今Delphiをアップグレードすることはできません。

誰かが私の質問は、このトピックに解決していると述べた。

Handling a Unicode String in Delphi Versions <= 2007

しかし、この話題はそれを行う方法を正確に告げず、サードパーティのコンポーネントを使用することを言います。

EDIT:後提案、iは、関数POSを使用削除して挿入しようとしたWideStringにするvar:

function addEmoji(mystring : widestring) : widestring; 
var r, aux : widestring; 
p : integer; 
begin 
r := mystring; 
while pos('(y)',r) > 0 do 
    begin 
    aux := r; 
    p := pos('(y)',aux); 
    Insert('',aux,p); 
    delete(aux,pos('(y)',aux),3); 
    r := aux; 
    end; 
result := r; 
end; 

しかし、結果は '(Y) '????' で置き換えられています。

+0

@RemyLebeauありがとう。絵文字データを失うことなく仕事をすることができるansireplacestrに似た機能はありますか? – delphirules

+0

@RemyLebeau私はこれらの機能を使ってみましたが、まだ絵文字を '???'で置き換えています。私はちょうどこの新しいアプローチで私の質問を編集しました。 – delphirules

+0

返信に+6ポイントがあると、なぜ人々はマイナスで質問をマークするのか不思議に思った... – delphirules

答えて

7

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()を使用する必要があります。 UTF8Stringtrue 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を貼り付ける必要があります。

WideStringShowMessage()に渡すなど、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)); 
+0

ありがとう、私はいくつかの調整の後にあなたのコードを試してみました( 'To:Widestring' by 'New:Widestring' 'To'をvar名として使用し、関数の戻り値を追加しました)、それでもまだ絵文字の代わりに '????' – delphirules

+0

@delphirules:試してみるとうまくいく。良い尺度のために、私はさらにそれをテストするためにDelphi 7に戻っていった。 –

+0

@RemyLebeau: 'ToText'に' FromText'が含まれていると、 'WideReplaceStr'がループに入りませんか? – MartynA

関連する問題