Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi UTF-8 nach ASCII (die 1000ste) (https://www.delphipraxis.net/191804-utf-8-nach-ascii-die-1000ste.html)

ernschd 21. Feb 2017 09:40

Delphi-Version: XE8

UTF-8 nach ASCII (die 1000ste)
 
Hallo,

ich bin immer noch mit der Portierung einer Software von Delphi 2007 nach XE8 beschäftigt. Jetzt habe ich Probleme mit der Kodierung.
In der Anwendung werden viele ASCII-Dateien geschrieben (mit write bzw. writeln).
Der Quellstring kommt aus einer Sqlite-Datenbank in UTF-8, welcher in Delphi 2007 mit Utf8ToAnsi und dann mit CharToOemBuff in die benötigte Kodierung umgewandelt wird. In XE8 wollte ich OemToCharA statt CharToOemBuff verwenden, was leider nicht funktioniert.
Hat jemand einen Hinweis, wie ich das Problem lösen könnte, ohne meine Anwendung komplett über den Haufen zu werfen?

Neutral General 21. Feb 2017 09:42

AW: UTF-8 nach ASCII (die 1000ste)
 
Übergibst du OemToCharA denn auch einen AnsiString und keinen String?

ernschd 21. Feb 2017 09:51

AW: UTF-8 nach ASCII (die 1000ste)
 
Delphi-Quellcode:
function OEM2Ascii(const OEMString: AnsiString): AnsiString;
begin
  Result := OEMString;
  if Result <> '' then
    OemToCharA(PAnsiChar(Result), PAnsiChar(Result));
end;

Neutral General 21. Feb 2017 10:01

AW: UTF-8 nach ASCII (die 1000ste)
 
Aufruf?

ernschd 21. Feb 2017 10:08

AW: UTF-8 nach ASCII (die 1000ste)
 
Delphi-Quellcode:
function GetFieldByName(const FieldName: string): String;
var s: String;
begin
    s := Utf8ToAnsi(GetFields(self.GetFieldIndex(FieldName)));
    if FIsAscii then s := OEM2Ascii(S);
    Result := s;
end;
Der Rückgabewert der Methode GetFields liefert einen String.

himitsu 21. Feb 2017 10:37

AW: UTF-8 nach ASCII (die 1000ste)
 
Zitat:

was leider nicht funktioniert.
Und das bedeutet?




Zitat:

Delphi-Quellcode:
function GetFieldByName(const FieldName: string): String;
var s: String;
begin
    s := Utf8ToAnsi(GetFields(self.GetFieldIndex(FieldName)));
    if FIsAscii then s := OEM2Ascii(S);
    Result := s;
end;

Utf8ToAnsi und dann in den String macht daraus wieder Unicode, aber nachdem Utf8ToAnsi für Informationsverlust gesorgt hat.
Delphi-Referenz durchsuchenUTF8ToString
Und dann wird das Unicode nach ANSI umgewandelt und an OEM2Ascii übergeben.

Was gibt GetFields für einen Typ zurück?

ernschd 21. Feb 2017 10:53

AW: UTF-8 nach ASCII (die 1000ste)
 
Bedeutet, dass ich BšCHER (ASCII) benötige, aber entweder BÜCHER (ANSI/Unicode) oder B_CHER bekomme.

GetFields liefert einen String.

mikhal 21. Feb 2017 10:53

AW: UTF-8 nach ASCII (die 1000ste)
 
Kannst du deine Texte nicht einer TStringList unterbringen, und mit TEncoding.ASCII als zusätzlichem Parameter abspeichern?

Grüße
Mikhal

ernschd 21. Feb 2017 11:03

AW: UTF-8 nach ASCII (die 1000ste)
 
Das wäre natürlich das einfachste, aber dafür müsste ich recht viele alte Units ändern, in denen direkt in eine Datei geschrieben wird, und der Aufwand dafür ist dann doch zu hoch.

p80286 21. Feb 2017 11:21

AW: UTF-8 nach ASCII (die 1000ste)
 
Zitat:

Zitat von ernschd (Beitrag 1362205)
Delphi-Quellcode:
function OEM2Ascii(const OEMString: AnsiString): AnsiString;
begin
  Result := OEMString;
  if Result <> '' then
    OemToCharA(PAnsiChar(Result), PAnsiChar(Result));
end;

Das ist kein OEM to ASCII !
Zugegeben es gibt in dem Bereich so viele eierlegende Wollmilchsäue, daß da der Überblick verloren gehen kann, aber ein wenig Genauigkeit könnte da nicht schaden.
(das ist eher ASCIItoANSI)

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:38 Uhr.
Seite 1 von 4  1 23     Letzte »    

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