AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Utf8Encode in D2009

Ein Thema von Assertor · begonnen am 28. Okt 2008 · letzter Beitrag vom 28. Okt 2008
Antwort Antwort
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#1

Problem mit Utf8Encode in D2009

  Alt 28. Okt 2008, 18:20
Hallo,

ich mache gerade ein paar Source-Reviews und stieß auf ein Problem mit der UTF8Encode Fkt. aus System.pas in Verbindung mit der VCL Unit EncdDecd.

Gegen sei folgender Source:

Delphi-Quellcode:
uses
  EncdDecd, Dialogs;
...
var
  s: UnicodeString; // bei D2006 ein WideString
begin
  s := 'Hätten Hüte ein ß im Namen, wären sie möglicherweise keine Hüte mehr,'+ sLineBreak +
    'sondern Hüße.' + sLineBreak;
  ShowMessage(EncodeString(UTF8Encode(s)));
end;
UTF8Encode ist unter D2009 prinzipiell überflüssig, wenn man eine Typzuweisung über tmpstr: Utf8String o.ä. macht. Das Ergebnis wird dadurch nicht verändert.

Nun zum Ausgabeergebnis:

D2006 (korrekt):
SMOkdHRlbiBIw7x0ZSBlaW4gw58gaW0gTmFtZW4sIHfDpHJlbi BzaWUgbcO2Z2xpY2hlcndlaXNl
IGtlaW5lIEjDvHRlIG1laHIsDQpzb25kZXJuIEjDvMOfZS4NCg ==

D2009:
SOR0dGVuIEj8dGUgZWluIN8gaW0gTmFtZW4sIHfkcmVuIHNpZS Bt9mdsaWNoZXJ3ZWlzZSBrZWlu
ZSBI/HRlIG1laHIsDQpzb25kZXJuIEj832UuDQo=

EncodeString arbeitet intern an dem String als Stream. Wenn man den Base64 aus D2009 umgekehrt, ist dieser sofort als Unicode lesbar (ohne UTF8Decode).

Was stimmt hier nicht? Verwende ich UTF8Encode falsch (wie gesagt Zuweisung über UTF8String bringt selbes Ergebnis).

Edit: Nachtrag. Es liegt nicht an EncdDecd, sondern defintiv an der Ausgabe von UTF8Encode. Gebe ich EncdDecd einen beliebigen String mit dem manuell UTF8-codierten String aus obigem Text, ist das Resultat identisch.

Dies führt zur Frage: Arbeitet UTF8Encode richtig in D2009? oder stehe ich gerade auf dem Schlauch nach so vielen Wochen Unicode?

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Problem mit Utf8Encode in D2009

  Alt 28. Okt 2008, 18:33
Erwartet EncodeString vll. einen String?

Dann könnte es sein, dass D2009 den UTF8 String automatisch in Unicode konvertiert (weil String ja UnicodeString ist, und du UTF8 übergibst ...)

siehe hier
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#3

Re: Problem mit Utf8Encode in D2009

  Alt 28. Okt 2008, 18:38
Hi,

Zitat von jfheins:
Erwartet EncodeString vll. einen String?

Dann könnte es sein, dass D2009 den UTF8 String automatisch in Unicode konvertiert (weil String ja UnicodeString ist, und du UTF8 übergibst ...)
Guter Ansatz, danke! Ich glaube auch das hier die CompilerMagic mir einen Strich durch die Rechnung macht. Der Link ist zwar brutal (viele obsolete Sachen enthalten, die in D2009 selbst oder besser gelöst sind).

Der Ansatz UTF8EncodeToShortString funktionert, aber ein ShortString ist sicher nicht lang genug.

Ich werde mal eine überladene EncodeString programmieren, mal sehen ob das hilft.

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#4

Re: Problem mit Utf8Encode in D2009

  Alt 28. Okt 2008, 18:47
So, des Problems Lösung:

Überladene Funktion für EncdDecd schreiben, die bei EncodeString mit UTF8String als Input arbeitet und dem TStringStream das Encoding manuell zuweisen:

Delphi-Quellcode:
function EncodeString(const Input: UTF8String): String; overload;
var
  InStr, OutStr: TStringStream;
begin
  InStr := TStringStream.Create(Input, TEncoding.UTF8);
  try
    OutStr := TStringStream.Create('');
    try
      EncodeStream(InStr, OutStr);
      Result := OutStr.DataString;
    finally
      OutStr.Free;
    end;
  finally
    InStr.Free;
  end;
end;
Die Ursache ist wirklich die automatische Rückwandlung von UTF8 zu Unicode. Danke Julius für die Idee!

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz