UTF8 nach Singlebyte

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
HK12
Beiträge: 24
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

UTF8 nach Singlebyte

Beitrag von HK12 »

Hi,
ich habe ein für mich großes Problem. Ich muss etwas aus einer MySqlDB lesen wo die Daten in UTF8 gespeichert sind. Ich brauche aber einen ganz "normalen" String. Nun habe ich UTF8ToSingleByte im netz gefunden. Aber leider weiß ich nicht wie man das Anwendet oder ob das die richtige Funktion ist. Es finden sich auch widersprüchliche angaben im netz die nicht gehen.

Wäre toll wenn mir jemand auf die Sprünge helfen könnte. Am liebsten natürlich mit einem ein zeiler Beispiel und welche Units ich einbinden muss.

Als Testeintrag habe ich "test – Spaß an der Sache". Wenn ich mir das in Hex ausgeben lasse ist das nur eine Zahlenkolonne. Deswegen hänge ich einen kleinen Screenshot mit dran, den man besser lesen kann. Es soll später auf Unix laufen.

Hex wäre 7465737420E2809320537061C39F20616E20646572205361636865

Vielen dank im Voraus
Dateianhänge
utf8-hex.png
utf8-hex.png (2.88 KiB) 377 mal betrachtet

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: UTF8 nach Singlebyte

Beitrag von theo »

Bist du sicher, dass du das brauchst und wenn ja wozu?
Unter Lazarus ist UFT8 ein "ganz normaler String".
Man kann nun mal nicht Unicode verlustfrei "einfach so" in ein "Singlebyte" quetschen.
Umwandlungen nach anderen Codierungen bietet z.B. die Unit "LConvEncoding".

HK12
Beiträge: 24
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: UTF8 nach Singlebyte

Beitrag von HK12 »

Hi,
die LConvEncoding habe ich drin. Wie gesagt ich komme mit dem UTF8ToSingleByte nicht zurecht. Der kann ruhig zeichen wegschmeißen, das wäre mir egal. Wichtig wären eigentlich nur die umlaute. Ich dachte das macht diese Routine.
Und ja, leider brauche ich das so. Sonst würde ich nicht schon 3 Tage suchen. Ich bin fast der meinung das man das schnell selber gemacht hätte. Aber wenn man einmal einen weg eingeschlagen hat, dann will man es auch wissen. :?

Ich weiß nicht was als zweiter Parameter in UTF8ToSingleByte kommt.

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: UTF8 nach Singlebyte

Beitrag von theo »

HK12 hat geschrieben:
Mi 3. Feb 2021, 14:29
Und ja, leider brauche ich das so.
Aber warum?
HK12 hat geschrieben:
Mi 3. Feb 2021, 14:29
Ich weiß nicht was als zweiter Parameter in UTF8ToSingleByte kommt.
Du musst einfach wissen, was die Ziel Codierung sein soll, dann geht auch z.B.
UTF8ToISO_8859_1(s);
UTF8ToISO_8859_15(s);
https://de.wikipedia.org/wiki/ISO_8859-15

HK12
Beiträge: 24
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: UTF8 nach Singlebyte

Beitrag von HK12 »

Vielen vielen dank.
Dieses Feld ist der Absender Name. Wenn man dort so einen "Mist" reinschreibt kommen diverse Clients nicht mit klar. Die zeigen dann an den stellen nur ? an. z.b. Spaß wird zu Spa?

Nochmals danke.

HK12
Beiträge: 24
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: UTF8 nach Singlebyte

Beitrag von HK12 »

Leider klappt es nicht. Mit meinem Beispiel String kommt folgendes raus: test - Spa? an der Sache
Ich habe mit folgends Array gemacht und fülle das in einen String. Lese ich den in einer schleife Zeichenweise aus, dann steht das auch drin.

Code: Alles auswählen

  x    :array[0..26] of Char=(#$74,#$65,#$73,#$74,#$20,#$E2,#$80,#$93,#$20,#$53,#$70,#$61,#$C3,#$9F,#$20,#$61,#$6E,#$20,#$64,#$65,#$72,#$20,#$53,#$61,#$63,#$68,#$65);
 
  line:='';
  for i:=Low(x) to High(x) do begin
    line:=line+x[i];
  end;
  WriteLn(UTF8ToISO_8859_2(line));
PS.: Ich habe auch UTF8ToISO_8859_1 probiert. Das gleiche.

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: UTF8 nach Singlebyte

Beitrag von theo »

Wie gesagt, du musst wissen, was die Ziel Codierung sein soll.
Auf Windows vllt. UTF8ToCP1252?
Und es ist auch nicht "Mist", sondern UTF8 und das ist heute eigentlich Standard.

In Unit LazUTF8 gibt es auch noch UTFToSys oder UTF8ToConsole.
Vllt. wirst du damit glücklich. Aber Blindflug ist immer schlecht bei Codierungen.

HK12
Beiträge: 24
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: UTF8 nach Singlebyte

Beitrag von HK12 »

Nochmal danke. UTF8ToConsole klappt einwandfrei.

Netten Gruß

Benutzeravatar
Winni
Beiträge: 557
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: UTF8 nach Singlebyte

Beitrag von Winni »

Hi!

Das ist nicht nur "eigentlich Standard"(Theo) -
das ist seit 20 Jahren Standard.

UTF-8 wurde 1992 "erfunden"

Da hat jemand die letzten 20 Jahre geschlafen!

Winni

PascalDragon
Beiträge: 227
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: UTF8 nach Singlebyte

Beitrag von PascalDragon »

HK12 hat geschrieben:
Mi 3. Feb 2021, 15:09
Dieses Feld ist der Absender Name. Wenn man dort so einen "Mist" reinschreibt kommen diverse Clients nicht mit klar. Die zeigen dann an den stellen nur ? an. z.b. Spaß wird zu Spa?
Ich nehme an dir geht es um E-Mail? Dann solltest du dir auch die entsprechende Thematik durchlesen, das ist nämlich alles geregelt. Wenn du natürlich nichts angibst, dann fällt der E-Mail Client auf den kleinsten Nenner zurück.
theo hat geschrieben:
Mi 3. Feb 2021, 14:51
Du musst einfach wissen, was die Ziel Codierung sein soll, dann geht auch z.B.
UTF8ToISO_8859_1(s);
UTF8ToISO_8859_15(s);
https://de.wikipedia.org/wiki/ISO_8859-15
Man kann auch einfach die CodePage Funktionalität nutzen, die jeder AnsiString seit FPC 3.0.0 mit sich rumschleppt, dann ist es nämlich sogar einfach nur eine Zuweisung:

Code: Alles auswählen

program tstrcnv;

uses
  {$ifdef unix}
  fpwidestring,
  {$endif} Character;

const
  CP_ISO8859_1 = 28591;

type
  TString8859_1 = type AnsiString(CP_ISO8859_1);

procedure DumpHex(const aStr: RawByteString);
var
  i: SizeInt;
begin
  for i := 1 to Length(aStr) do begin
    if (i > 1) and ((i - 1) mod 15 = 0) then
      Writeln;
    Write(HexStr(Ord(aStr[i]), 2), ' ');
  end;
  Writeln;
end;

var
  sutf8: UTF8String = #$74#$65#$73#$74#$20#$E2#$80#$93#$20#$53#$70#$61#$C3#$9F#$20#$61#$6E#$20#$64#$65#$72#$20#$53#$61#$63#$68#$65;
  siso: TString8859_1;
begin
  Writeln('UTF8:');
  DumpHex(sutf8);
  { this is where the magic happens }
  siso := sutf8;
  Writeln('ISO8859-1:');
  DumpHex(siso);
end.
Ausgabe:

Code: Alles auswählen

UTF8:
74 65 73 74 20 C3 A2 C2 80 C2 93 20 53 70 61
C3 83 C2 9F 20 61 6E 20 64 65 72 20 53 61 63
68 65
ISO8859-1:
74 65 73 74 20 E2 80 93 20 53 70 61 C3 9F 20
61 6E 20 64 65 72 20 53 61 63 68 65
FPC Compiler Entwickler

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: UTF8 nach Singlebyte

Beitrag von theo »

PascalDragon hat geschrieben:
Do 4. Feb 2021, 09:37
Man kann auch einfach die CodePage Funktionalität nutzen, die jeder AnsiString seit FPC 3.0.0 mit sich rumschleppt, dann ist es nämlich sogar einfach nur eine Zuweisung:
Sagen wir mal "Kann man auch nutzen". Für "einfach" halte ich es nicht.

Code: Alles auswählen

const
  CP_ISO8859_1 = 28591;

type
  TString8859_1 = type AnsiString(CP_ISO8859_1);
Dafür muss ich mich erst schlau machen.
UTF8ToISO_8859_1(s) klappt ohne Verrenkungen aus dem FF.

HK12
Beiträge: 24
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: UTF8 nach Singlebyte

Beitrag von HK12 »

PascalDragon hat geschrieben:
Do 4. Feb 2021, 09:37
Ich nehme an dir geht es um E-Mail? Dann solltest du dir auch die entsprechende Thematik durchlesen, das ist nämlich alles geregelt. Wenn du natürlich nichts angibst, dann fällt der E-Mail Client auf den kleinsten Nenner zurück.
Jop, es geht um EMail. Sorry, da ich den Text 2x geändert habe ist das wohl raus gefallen. Das passiert wenn man nervös ist. :wink:

Versendet wird mit Synapse unter Debian. Im Moment frage ich die Mails mit Roundcube (Webinterface) ab. Dort ist halt alles im Eimer. Es geht um das Feld from:. Was ich gemerkt habe ist, wenn "normaler" Text ohne umlaute oder sowas drin ist, dann klappt es und es steht nicht From: "=?UTF-8?Q?.... usw. drin. Sondern z.b. From:"test" <mail@domain.com> drin.
Beim Feld Subject ist das egal. Da darf das mit UTF8 drin stehen.

Nun habe ich noch nicht getestet wie andere Client das genau anzeigen. Es gibt ja massenhaft.

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: UTF8 nach Singlebyte

Beitrag von theo »

Hast du den richtigen Header?
z.B.

Code: Alles auswählen

Mime-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Ich würde meine Energie in das Austüfteln des richtigen Mail-Heades stecken, statt in die Umwandlung von UTF-8 in "Single Byte", dann hast du Ruhe.

HK12
Beiträge: 24
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: UTF8 nach Singlebyte

Beitrag von HK12 »

Jop, habe ich. Wie gesagt, vielleicht liegt es am RoundCube. Weil auch wenn ich z.b. Test äöü reinschreibe macht Synapse das UFT8 davor. Ich dachte erst das liegt an mir.

Timm Thaler
Beiträge: 1175
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: UTF8 nach Singlebyte

Beitrag von Timm Thaler »

Ja oder Du schaust mal auf den Kalender, stellst fest dass wie 2021 haben und machst Alles in Utf8.

Einmal Utf8 konsequent durchgezogen und man spart sich viel Ärger mit Konvertierungen.

Antworten