Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   FreePascal Text von DOS/Windows Codepage nach Unicode konvertieren (auch unter Linux) (https://www.delphipraxis.net/212269-text-von-dos-windows-codepage-nach-unicode-konvertieren-auch-unter-linux.html)

mjustin 16. Jan 2023 18:51

Text von DOS/Windows Codepage nach Unicode konvertieren (auch unter Linux)
 
Wie konvertiere ich in Free Pascal (3.x) unter Linux einen Text, der in einem bekannten DOS- oder Windows Encoding vorliegt, unter Angabe einer Single- oder Multibyte Codepage (z.B. Windows-1252, DOS 437/850, 949 (Koreanisch) ...))? Unter Windows funktioniert es mittels MultiByteToWideChar. Die Strings könnten eine dieser Codepages verwenden. Welche es ist, ist zum Konvertierungszeitpunkt bekannt. (z.B. CP 1258, Vietnamesisch, oder CP 932, Japanisch SJIS)

Delphi-Quellcode:
  // code page ids
  CP_THAI = 874; // ANSI/OEM Thai (ISO 8859-11); Thai (Windows)
  CP_SJIS = 932; // ANSI/OEM Japanese; Japanese (Shift-JIS)
  CP_GB2312 = 936; // ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312)
  CP_KOREAN = 949; // ANSI/OEM Korean (Unified Hangul Code)
  CP_BIG5 = 950; // ANSI/OEM Traditional Chinese (Taiwan; Hong Kong SAR, PRC); Chinese Traditional (Big5)
  CP_EASTEUROPE = 1250; // ANSI Central European; Central European (Windows)
  CP_RUSSIAN = 1251; // ANSI Cyrillic; Cyrillic (Windows)
  CP_ANSI = 1252; // ANSI Latin 1; Western European (Windows)
  CP_GREEK = 1253; // ANSI Greek; Greek (Windows)
  CP_TURKISH = 1254; // ANSI Turkish; Turkish (Windows)
  CP_HEBREW = 1255; // ANSI Hebrew; Hebrew (Windows)
  CP_ARABIC = 1256; // ANSI Arabic; Arabic (Windows)
  CP_BALTIC = 1257; // ANSI Baltic; Baltic (Windows)
  CP_VIETNAMESE = 1258; // ANSI/OEM Vietnamese; Vietnamese (Windows)
  CP_MACROMAN = 10000; // MAC Roman; Western European (Mac)
In der Dokumentation unter https://www.freepascal.org/docs-html...x32-390003.2.4 ist dieses Beispiel enthalten:

Delphi-Quellcode:
{$h+} 
uses sysutils;

Type
  TString1 = Type*String(1252);
  TString2 = Type*String(1251);

Var
  A : TString1;
  B : TString2;

begin
  A:='123'+'345'+intToStr(123);
  B:=A;
  Writeln('B: "',B,'" : ',StringRefCount(B),' -> ',StringCodePage(B));
  Writeln('A: "',A,'" : ',StringRefCount(A),' -> ',StringCodePage(A));
end.

Für Unices heisst es dazu: "Remark Code page support requires quite some helper routines, these are implemented in the unicodestring manager. On windows, the system routines are used for this. On Unices, the cwstring unit can be used to link to the C library and use the C library conversion support. Alternatively, the fpwidestring unit contains a unicodestring manager implemented natively in Object Pascal."

Ist dieser Lösungsansatz der Einzige (für Unices) oder gibt es Alternativen, die einfacher zu implementieren sind, und keine Deklaration der String-Typen für alle benötigten Codepages notwendig ist?


https://en.wikipedia.org/wiki/Windows_code_page

mytbo 16. Jan 2023 19:42

AW: Text von DOS/Windows Codepage nach Unicode konvertieren (auch unter Linux)
 
In mORMot gibt es die Cross-Platform Unit mormot.core.os. Vielleicht findest du hier weitere Hilfe.

Bis bald...
Thomas

KodeZwerg 16. Jan 2023 20:01

AW: Text von DOS/Windows Codepage nach Unicode konvertieren (auch unter Linux)
 
Mit dem widestringmanager sollte es problemlos zum gewünschten Resultat führen.
Delphi-Quellcode:
function StrToCodePage(const AString: UnicodeString; ACodePage: TSystemCodePage): AnsiString;
begin
  Result := '';
  widestringmanager.Unicode2AnsiMoveProc(Pointer(AString), RawByteString(Result), ACodePage, Length(AString));
end;

himitsu 16. Jan 2023 20:48

AW: Text von DOS/Windows Codepage nach Unicode konvertieren (auch unter Linux)
 
TEncoding?

mjustin 17. Jan 2023 12:02

AW: Text von DOS/Windows Codepage nach Unicode konvertieren (auch unter Linux)
 
Herzlichen Dank für die Antworten, ich werde den dann entstandenen Beispielcode hier später diese Woche posten. (Meine Linux-Umgebung mit Lazarus 2.2.4 wurde erst spät abends fertig)

Viele Grüße

mytbo 17. Jan 2023 15:19

AW: Text von DOS/Windows Codepage nach Unicode konvertieren (auch unter Linux)
 
Zitat:

Zitat von mjustin (Beitrag 1517508)
Meine Linux-Umgebung mit Lazarus 2.2.4 wurde erst spät abends fertig

Einfach ausführen lässt es sich mit FPCUpDeluxe. Lazarus mit Cross-Compilern unter Windows installieren und die ersten Schritte zur Erstellung eines Projekts, wird ausführlich in diesem YouTube Video erklärt.

Bis bald...
Thomas

mjustin 28. Jan 2023 09:47

AW: Text von DOS/Windows Codepage nach Unicode konvertieren (auch unter Linux)
 
Gelöst (für Free Pascal):

Delphi-Quellcode:
function TUnicodeConverter.IntCharToUnicode(ASource: RawByteString): string;
var
  Tmp: UnicodeString;
begin
  Widestringmanager.Ansi2UnicodeMoveProc(PChar(ASource), FCodePage, Tmp, Length(ASource));
  Result := Tmp;
end;
Läuft für alle getesteten Zeichensätze, auch Multibyte (Koreanisch, Japanisch, Chinesisch GB2312 und Big5).

Danke für die Anregungen!

Nun die kleine Zusatzfrage: wie kann ich das unter Linux mit FireMonkey abbilden? Ich vermute, da muss mit TEncoding gearbeitet werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 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