[GELÖST] Dreh mich im Kreis mit 'ß'...

Für Fragen von Einsteigern und Programmieranfängern...
BitRausch
Beiträge: 50
Registriert: Di 30. Mai 2017, 09:32

Re: Dreh mich im Kreis mit 'ß'...

Beitrag von BitRausch »

wp_xyz hat geschrieben:
BitRausch hat geschrieben:Nein es ist kein Konsolenprogramm [...] Wollte nur sagen das die Datensätze nicht über ein GUI Element angezeigt werden.

Sorry dass ich so dumm frage, aber wo ist dann das Problem? Wenn du die Strings weder in einem Gui-Control noch auf der Konsole anzeigst, wie willst du dann wissen, dass die Kodierung nicht stimmt?


@wp_xyz - ich weiss es nicht. Ich vermute es da dieses besondere Zeichen nicht korrekt weggeschrieben wird bzw. mir ein Zeichen in der Satzlänge fehlt und weil mir im Debugger die Variable mit dem #157 angezeigt wird...
Meine Suche im Forum und im Netz hat mich ständig auf die Behandlung von Konvertierungsproblemen zwischen UTF-8/Ansi geführt...
Daher die Annahme das es etwas mit Umwandlung zu tun haben könnte...

BitRausch
Beiträge: 50
Registriert: Di 30. Mai 2017, 09:32

Re: Dreh mich im Kreis mit 'ß'...

Beitrag von BitRausch »

MacWomble hat geschrieben:in ANSI CP 1252 ist 157 nicht definiert

157 0x9D undefined

Es wäre hilfreich, etwas über die Quelle der Datei zu erfahren. Kommt diese eventuell aus einem fremdsprachigen Programm?


hmm ... gute Frage. Ich glaube nicht. Die Tabelle wird aus einem deutschsprachigem Excel geliefert...

BitRausch
Beiträge: 50
Registriert: Di 30. Mai 2017, 09:32

Re: Dreh mich im Kreis mit 'ß'...

Beitrag von BitRausch »

boah ... was für ein Murks...
Nach weiterem recherchieren bin ich auf folgendes gestoßen:
157 $9D OSC Operating System Command 235 9/13 OC
ESC ] Starts an operating system control string. The string ends at ST and is interpreted subject to the operating system.

Gefunden hier:
http://www.aivosto.com/vbtips/control-c ... s.html#OSC

Daraus entnehme ich das statt ein 'ß' ein nicht druckbares Controlzeichen eingegeben wurde... vielleicht durch eine Copy&Past Aktion bei der Erstellung der Tabelle...

So ein Sch... :evil: :evil: :evil: :evil:

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Dreh mich im Kreis mit 'ß'...

Beitrag von Michl »

:twisted: Da bringe ich mal noch ein bischen mehr Verwirrung in Spiel...

BitRausch hat geschrieben:Aus eine CSV Datei (ANSI) lese ich eine Textfeld ein. ... Dieses Feld soll über eine StringList in eine Text Datei geschrieben werden

Wenn deine GUI-Anwendung tatsächlich nicht viel mehr als das machen soll, dann wäre dies einer der seltenen Fälle, wo es vermutlich sinnvoll ist, nicht den Lazarus-Hack zu einer Umwandlung nach UTF-8 und zurück zu machen, sondern mit der systemvorgegebenen Codepage zu arbeiten. Dazu brauchst du nur den Compilerswitch -dDisableUTF8RTL setzen. Achtung, alle Aus- und Eingaben der LCL-Controls müssen dann expilzit nach bzw. von UTF-8 gwandelt werden. Weitere Infos: http://wiki.freepascal.org/Lazarus_with_FPC3.0_without_UTF-8_mode

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Dreh mich im Kreis mit 'ß'...

Beitrag von Mathias »

Habe vorhin mein Artikel in der CT fertig gelesen,
Bei Codepage 437, 850 ist das ß bei #225,
Bei Codepage 1252, ISO-8859-15 bei #223,
Und bei MacRoman bei #167.

Ein grösseres durcheinander kann es kaum geben. :roll:
Von UTF8, ist da aber noch nicht die Rede.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

BitRausch
Beiträge: 50
Registriert: Di 30. Mai 2017, 09:32

Re: Dreh mich im Kreis mit 'ß'...

Beitrag von BitRausch »

Ich glaube ich weiß was passiert ist. Siehe auch letztes posting:

Hier wurden wohl Daten aus einem Host Fenster (VT100) wohl per Copy&Paste eingefügt in eine Excel Tabelle eingefügt ...
Besonders wenn ich diese Beschreibung lese:

Code: Alles auswählen

History of C1
 
In 1979 ANSI released additional controls for use with ASCII (ANSI X3.64). This came to be known as the C1 set. A similar set was also released as ECMA-48. According to ANSI, the C1 controls were intended for input/output control of two-dimensional character-imaging devices, including interactive terminals of both the cathode ray tube and printer types, as well as output to microfilm printers.
 
A bit later, in 1983, the C1 set was standardized as ISO 6429. Standard-wise, the C1 set has been volatile. Both ISO 6429 and ECMA-48 were updated several times. New control characters were added and definitions updated. One of the C1 characters (IND) was eventually deprecated and removed.
 
The standards actually cover more control codes than those that fit in the C1 area. These additional controls are used via control sequences (escape sequences). The sequences are beyond the subject of this article. Let it suffice that the sequences are an important part of the standards that should be used together with the C1 controls. The sequences, together with C1, are also known as VT100 and ANSI escape sequences.
 
Current status of C1
 
The current standards for C1 are ISO/IEC 6429:1992 and ECMA-48:1991. These standards now define both the C0 and C1 control characters.
 
Unicode allows the use of C1 (and C0 too). In fact, the C1 area has been entirely reserved for control codes in Unicode. On the contrary, the (somewhat outdated) DOS and Windows codepages, i.e. character sets, have not reserved space for C1. Instead, they have included additional graphic characters in the C1 area. This doesn't prevent the use of C1 controls on DOS and Windows, though.
 
In practice, the C1 control characters are not very common. They are specialized codes for special applications.

BitRausch
Beiträge: 50
Registriert: Di 30. Mai 2017, 09:32

Re: Dreh mich im Kreis mit 'ß'...

Beitrag von BitRausch »

Jetzt verstehe ich auch warum Rosa Bl³ten so angezeigt wird...

Leute - ich glaub ich hab's jetzt gecheckt. Vielen Dank an Euch alle für die wirklich tolle Hilfe...!!!
Wie ich das jetzt in Zukunft verhindern kann weiß ich noch nicht...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Dreh mich im Kreis mit 'ß'...

Beitrag von Mathias »

Wie ich das jetzt in Zukunft verhindern kann weiß ich noch nicht...

Wen du die CSV erstellt sollte dies nicht so ein Problem sein, schlimm ist es ,wen jemand anders sie erstellt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

BitRausch
Beiträge: 50
Registriert: Di 30. Mai 2017, 09:32

Re: Dreh mich im Kreis mit 'ß'...

Beitrag von BitRausch »

Ja. Das stimmt und da liegt auch das Problem. Die Daten bekomme ich geliefert...
Ich brauch ein Bier... :evil:

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Dreh mich im Kreis mit 'ß'...

Beitrag von af0815 »

Bei Textencoding nimm lieber einen Kasten. SCNR
Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

BitRausch
Beiträge: 50
Registriert: Di 30. Mai 2017, 09:32

Re: Dreh mich im Kreis mit 'ß'...

Beitrag von BitRausch »

af0815 hat geschrieben:Bei Textencoding nimm lieber einen Kasten. SCNR
Andreas


Ich denke ich mach was besseres: Ich geh gleich in die Kneipe und leg mich unter den Zapfhahn :lol: :lol: :lol:

Aber ganz toll Männer - ich würde Euch alle gerne dazu einladen. Das wäre das mindeste für Eure Unterstützung - echt!

BitRausch
Beiträge: 50
Registriert: Di 30. Mai 2017, 09:32

Re: Dreh mich im Kreis mit 'ß'...

Beitrag von BitRausch »

der Vollständigkeit halber poste ich hier "meine" Lösung.
Sie ist nicht auf meinem Mist gewachsen aber sie funktioniert...
Da ich nur den Unicode für das 'ü' kenne wird auch nur diese z.Zt. umgewandelt.

Code: Alles auswählen

 
{Funktion zum entfernen von Steuerzeichen im String und umwandeln von Umlauten}
function RemoveESCChars(const s: string): string;
const
   InvalidChars : set of char = [#128..#159];        // Bestimmte C1 Steuerzeichen
 
var
   i : Integer;
 
begin
   Result:='';
   for i:=1 to Length(s) do
     if not (s[i] in InvalidChars) then
       Result:=Result+s[i]
     else
       Result:=Result+' ';
   Result:=ReplaceUmlaut(Result);
end;
 
{Wandelt ³ in 'ü' Zeichen um. }
function ReplaceUmlaut(const s: string):String;
var
  t : String;
begin
  t:= StringReplace(s,#179,'ü',[rfReplaceAll]);
  Result:=t;
end;
 
 

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: [GELÖST] Dreh mich im Kreis mit 'ß'...

Beitrag von wp_xyz »

Versteh' ich nicht... Ich dachte, das Problem war das Zeichen #157, an dem du das 'ß' erwartet hast. Warum bügelst du da dann den ganzen Bereich von 128 bis 159 glatt? Und was willst du eigentlich? Du ersetzt das Zeichen #179 durch ein 'ü' - aber auf CP1252 ist an dieser Position schon das 'ü'. Oder willst du alles nach UTF8 konvertieren? Dann nimm doch CP1252ToUTF8 und lasse den String vorher über eine Funktion laufen, die das Zeichen #157 durch ein 'ß' von CP1252 ersetzt (#223). Aber solange du nicht weiß, wie genau das #157 an die Stelle des 'ß' gekommen ist, bleibt das Gemurks, denn wer sagt denn, dass das #157 nicht auch andere Zeichen verfälscht hat.

Warum postest du nicht einfach die Excel-Datei und die CSV-Datei?

BitRausch
Beiträge: 50
Registriert: Di 30. Mai 2017, 09:32

Re: [GELÖST] Dreh mich im Kreis mit 'ß'...

Beitrag von BitRausch »

Leider kann ich die CSV Datei und die Exceldatei nicht posten.

Laut C1 sind in diesem Bereich (128-159) die Control Characters.
http://www.aivosto.com/vbtips/control-c ... s.html#OSC

Anstatt nur ein Zeichen abzufangen und vielleicht später das gleiche Problem mit einem anderem Zeichen zu haben klammer ich den ganzen Bereich aus.
Ich vermute dass an der Stelle ein 'ß' stehen sollte. Da es aber um ein Beschreibungsfeld handelt und mir nur wichtig ist das die Länge des Feldes wieder stimmt ersetze ich es durch ein Leerzeichen.
Es könnte ja auch sein das dieses Kontrollzeichen bei einem anderem Wort/Buchstabe auftritt. Wie Du schon sagst - ich kann nicht sagen aus welcher Quelle die Daten in die Exceltabelle kopiert/eingefügt wurden...

Das Zeichen #179 steht im Unicode für " ³ ". So steht es auch in der CSV Datei. Die Umwandlung CP1252ToUTF8 hatte ich probiert. Es wandelt das Zeichen nicht in ein 'ü' um.
In Ansi wird das Zeichen so dargestellt: Bl³ten
In UTF-8 zeigt mir Notepad an der Stelle xB3 was laut dieser Tabelle für diese Zeichen ³ steht.
(http://www.utf8-chartable.de/unicode-ut ... ng-literal)

BitRausch
Beiträge: 50
Registriert: Di 30. Mai 2017, 09:32

Re: [GELÖST] Dreh mich im Kreis mit 'ß'...

Beitrag von BitRausch »

Ich hab mal die 2 Elemente extrahiert und als Excel und CSV angehängt.
Dateianhänge
Zeichenfehler.zip
(6.09 KiB) 67-mal heruntergeladen

Antworten