2017-08-25 29 views
0

$C3 $A2 $C2 $80 $C2 $99は、UTF-8でエンコードされたUnicode 文字のダブルエンコードUTF-8形式$E2 $80 $99です。Delphi:ダブルエンコードされたUTF8テキストを復元する方法

$E2は、1バイト文字として処理され、UTF-8は$C3 $A2としてエンコードされます。 $80$C2 $80として再符号化され、$99$C2 $99として再エンコードされます。

$E2 $80 $99をこれよりもスマートな方法で返すことができますか?

ThisText := AnsiReplaceStr(ThisText, #$C3#$A2#$C2#$80#$C2#$99, '’'); 

すべての文字は?

不要なdouble-UTF8エンコーディングが頻繁に発生する場合があります。 ソリューション(?)はオンラインで提供されますが、Python、PHPまたはSQLでのみ提供されます。このような

何か:

CONVERT(CAST(CONVERT(field USING latin1) AS BINARY) USING utf8) 

$C2 $80$C2 $99でもないが、CP1252の文字であるため、私見では、ここでは動作しません。 ANSIの変換では、$E2 $ 80 $99の代わりに$E2 $3F $3Fが得られます。

+0

これは大丈夫ですか? –

+2

「私(誰か他の人ですか?)がUTF8文字列を取り、それがASNIテキストであるかのように扱い、UTF8に変換しましたか?確かに良い方法は、それを回復しようとするのではなく、最初にそれをすることではありませんか?治療よりも予防​​が大切です! – Dsm

答えて

6

データが2重エンコードされていることがわかっている場合は、単純にダブルデコードしてください。 UTF-8で一度デコードし、結果の値を8ビットに切り捨て、UTF-8で再度デコードします。

function FixUTF8(const S: UTF8String): UTF8String; 
var 
    Temp: UnicodeString; // use WideString prior to D2009 
    I: Integer; 
begin 
    // use UTF8Decode() prior to D2009 
    Temp := UnicodeString(S); // UTF-8 -> UTF-16 
    SetLength(Result, Length(Temp)); 
    for I := 1 to Length(Temp) do 
    Result[I] := AnsiChar(Ord(Temp[I])); // truncate to 8bit 
end; 

例えば

$C3 $A2 -> $00E2 -> $E2 
$C2 $80 -> $0080 -> $80 
$C2 $99 -> $0099 -> $99 

$E2 $80 $99 -> ’ 

しかし、実際には、データは単に二重UTF-8でエンコードされません。

function FixUTF8(const S: UTF8String): UTF8String; 
type 
    Latin1String = type AnsiString(28591); // or 1252 
var 
    Temp: RawByteString; 
begin 
    // use UTF8Decode() and WideCharToMultiByte() prior to D2009 
    Temp := Latin1String(S); // UTF-8 -> UTF-16 -> Latin-1 
    SetCodePage(Temp, CP_UTF8, False); // don't re-encode, just re-interpret 
    Result := Temp; //return as-is 
end; 

いずれかの方法をあなたは今、:あなたにも、余分なラテン-1のステップを考慮する必要がありますので、それは、最初にUTF-8エンコードされ、その後、ラテン-1と誤解して、もう一度UTF-8でエンコードされています

var 
    ThisText: UTF8String; 
begin 
    ThisText := #$C3#$A2#$C2#$80#$C2#$99; 
    ThisText := FixUTF8(ThisText); 
    ... 
end; 

しかし、本当の解決策は最初に誤った二重エンコードを避けることです。

+0

次回は間違ったファイルを作者に伝えようとします! :-) –

+0

ファイルは、有名なブリッジオンラインサイトの2017 Bridge Game Championshipのスクリプトです。ファイル内のコメントに特殊文字が含まれていると、ソフトウェアに問題が発生することがあります。私は彼らに話すために適切な人に連絡しようとしています。その間に、私が読みやすいフランス語を読んでみたい場合は、ファイルを修正する必要があります。それはすべての話です。 –

関連する問題