Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ? (https://www.delphipraxis.net/204390-womit-kann-man-versteckte-unicode-ascii-zeichen-im-code-finden.html)

Rollo62 26. Mai 2020 08:20

Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Hallo zusammen,

ich habe gerade den Link hier gesehen, wo es im Debugging geht.

Ich habe gerade ein ähnlcihes Problem, zwar nicht mit dem Debugger, aber irgendwo im Code könnte
sich ein nicht-printbares Unicode- oder ASCII-Zeichen eingeschlichen haben.
Ich sehe Fehler in Ausgabe-Texten und kann auch mit einem HEX-Editor die falschen Zeichen Zeichen sehen,
manche Editoren zeigen das aber gar nicht erst an.

Einige Units habe ich auf Unicode gesetzt, weil ich auch die internationalen Übersetzungen da drin habe.

Leider kann ich nicht genau sagen wo im Code das Problem genau herkommt, deshalb meine Frage:

Gibt es vielleicht in der IDE oder mit anderen Tools (Grep, RegEx, o.ä.) eine schnelle Suche aller Code-Stellen mit ungewöhlichen Unicode oder ASCII-Zeichen ?

himitsu 26. Mai 2020 09:13

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Delphi-Referenz durchsuchenTFile.ReadAllText und im Debugger nachsehn oder mit ner Schleife drüberlaufen

oder Hier im Forum suchenHxD


Ungewöhnliche Zeichen sind vorallem fast alle von #0 bis #31 (kleiner ' ') , außer #13#10 (Zeilenumbruch) und #9 (Tab),
und wenn du sonst keine Umlaute oder Unicode benutzt hast, dann auch noch ab #127.

Rollo62 26. Mai 2020 09:46

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Hallo himitsu,

danke für die Vorschlage, mit HxD hatte ich mir schon die Ergebnisse angeschaut, aber noch nicht die Units.
Aber kann damit nach auch Allen Vorkommen in Allen Units suchen ?
Ich dachte der ist nur für einzelne Files gedacht, und kann auch keine HEX-Ranges absuchen.

Mit ReadAllText o.ä. was selber bauen wäre eigentlich die letzte Möglichkeit,
ich hoffe eigentlich noch das es was in der IDE oder anderen Tools gibt.

mytbo 26. Mai 2020 10:03

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Wenn du das auf bestimmte Units eingrenzen kannst, schaue dir diese Dateien doch mal mit Notepad++ an. Damit stehen dir viel mehr Funktionen zur Verfügung.
https://notepad-plus-plus.org

Bis bald...
Thomas

Rollo62 26. Mai 2020 11:03

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Hallo mytbo,

es geht um ein paar hundert Units, wo das Problem auftreten könnte.
Deshalb würde ich das ungerne manuell suchen, sondern z.B. mit einem cleveren Grep o.ä. nach den Stellen suchen lassen.
Es wird womöglich nur 10-20 Stellen geben, die kann ich dann mit Editoren oder HxD checken,
aber diese Stellen erstmal zu finden ist mein Problem.

TiGü 26. Mai 2020 11:13

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
https://www.google.com/search?q=rege...ckoverflow.com

Assarbad 26. Mai 2020 11:22

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
PowerGREP (absolut sein Geld wert und in Delphi geschrieben!) und reguläre Ausdrücke. Alternativ ripgrep, aber dann vermutlich nur mit aktivierter PCRE2.

Du wirst ja sicher den Bereich des BMP eingrenzen können, oder?

Zitat:

Zitat von Rollo62 (Beitrag 1465289)
Gibt es vielleicht in der IDE oder mit anderen Tools (Grep, RegEx, o.ä.) eine schnelle Suche aller Code-Stellen mit ungewöhlichen Unicode oder ASCII-Zeichen ?

Was sind denn für dich ungewöhnliche Unicode-Zeichen? Alle außerhalb vom BMP? ASCII ist ohnehin eine Untermenge von Unicode, daher ist die Dopplung nicht aussagekräftig.

Aber deine Frage ist leider ungenau. Geht es dir um Zeichen die die man nicht sehen kann (Steuerzeichen ala LF usw.) oder um Zeichen die nicht allein stehen können (modifier symbol/letter)? Oder worum genau geht es? Schau mal in diese Übersicht hier.

Und dann wäre halt die Frage ob du das Problem nicht schon:
  1. anhand des BOM auf wenige Dateien eingrenzen kannst
  2. durch Nutzung einer Schriftart mit möglichst weitreichender Unicode-Unterstützung das Problem umgehen kannst

Zitat:

Zitat von TiGü (Beitrag 1465329)

:gruebel: ... häh weder war das die Frage, noch ergibt die Frage wie du sie eingetippt hast viel Sinn. Es sei denn wir reden über komplett alternative Kodierungen ala EBCDIC.

TiGü 26. Mai 2020 11:40

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Zitat:

Zitat von Assarbad (Beitrag 1465331)
Was sind denn für dich ungewöhnliche Unicode-Zeichen? Alle außerhalb vom BMP? ASCII ist ohnehin eine Untermenge von Unicode, daher ist die Dopplung nicht aussagekräftig.

Aber deine Frage ist leider ungenau.
Zitat:

Zitat von TiGü (Beitrag 1465329)

:gruebel: ... häh weder war das die Frage, noch ergibt die Frage wie du sie eingetippt hast viel Sinn. Es sei denn wir reden über komplett alternative Kodierungen ala EBCDIC.

Ja nun, dir ist die Frage doch auch ungenau?!? :gruebel:
Meine Güte, dann halt "regex find non-printable characters".

Assarbad 26. Mai 2020 11:45

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Nichts für ungut. Warten wir mal ab was der Themenersteller uns noch so erzählt.

Rollo62 26. Mai 2020 12:49

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Ja sorry, wenn ich das falsche Zeichen schon kennen würde wäre es leichter :-D

Ungewöhnliche Zeichen <==> alles was nicht in den Code gehört
- Unter CrLf denke ich wird nicht problematisch sein, könnte es aber doch
- Alles asserhalb [0..9,a..z,A..Z,normale Steuerzeichen]

Ich habe jedenfalls nicht die normalen ASCII-Zeichen bis 127 in Verdacht, damit kommt die IDE ja klar.
Ich vermute das irgendwo per Copy/Paste ein Unicode-Zeichen aus einer anderen Codepage reingerutscht ist, das wie ein normales Zeichen aussieht.

Ein mögliches Zeichen wäre 0xB0, das finde ich z.B. in einer gespeicherten Ausgabedatei,
welche an mehreren Stellen generiert werden kann, ich die Ursache aber nicht finde.

Also eine GREP Suche mit > 127 wäre erstmal das wo ich glaube das es was bringen könnte.
In einer Unit habe ich Übersetzungen in Unicode, auch da wäre es interessant nach ungewöhnlcihen Zeichen zu suchen.

@Assarbard, TiGü
Dankesehr für die Mithilfe, ich versuche mich mal mit ein paar der GREP Befehlen, ob da was sinnvolles bei rauskommt.

mytbo 26. Mai 2020 16:08

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Mal folgenden Versuch starten:
Erstelle eine komplette Kopie deines Sourcecode Verzeichnisses. Schreibe eine kleine Hilfsfunktion. In der mORMot Library Unit SynCommons.pas gibt es viele Funktionen zum Konvertieren.
Delphi-Quellcode:
var
  i: Integer;
  list: TFileNameDynArray;
begin
  list := FindFilesDynArrayToFileNames(FindFiles('F:\myStartDir', '*.pas', '', False, True, True));
  for i := Low(list) to High(list) do
    FileFromString(AnyTextFileToString(list[i], True), list[i]);
end;
Dann mit dem Total Commander und dem Befehl "Verzeichnisse synchronisieren" nachschauen was sich zwischen Original und Kopie geändert hat.

Bis bald...
Thomas

p80286 26. Mai 2020 22:01

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Zähl doch einfach die Bytes:

Code:
Pseudocode:

type
BCarray = array [0..255] of Integer;
.....

for i:=0 to length_of_File do inc(bcarray[bytestream[i]),1);
Grundannahme ist, daß die Datei Ansi-codiert ist. In diesem Falle liegen die häufigsten

Gruß
K-H

Sherlock 27. Mai 2020 09:08

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Sofern ich mich recht entsinne, sollte ein Formatieren des Codes durch eines der gängigen Tools (IDE oder auch GExperts) ausreichen. Es gibt da wohl auch die Option das komplette Projekt zu formatieren.

Sherlock

Assarbad 27. Mai 2020 10:42

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Hab das jetzt mal mit ripgrep in meinem Home-Verzeichnis durchexerziert:
Code:
rg -P '[^\x00-\x7FÄÖÜäöüß]'
... du kannst andere Zeichen zwischen ß und ] einfügen.

Falls du dich mit RE noch nicht so auskennst: "[]" definiert eine Menge von Zeichen auf die der Ausdruck zutrifft, "^" negiert das, "\x00-\x7F" trifft auf alle ASCII-Zeichen (also 0..127) zu und dahinter folgen halt die Umlaute in Groß- und Kleinschreibung, sowie ß.

Was ich damit fand waren bspw. das Copyrightzeichen ©, Apostrophe ’ (statt ' auf der Tastatur), ², ●, µ, └, ─, à, í, î, ⍝, •, ‣, ⁃, χ, ⍺, ⍶, ⍵, ∇, ⍫, é, jede Menge Emojis (hunderte!) und diverse Zeichen die in einer anderen Codepage Sinn ergeben, aber nicht als UTF-8 interpretiert. Jetzt muß ich erstmal aufräumen, weil viel von dem Code eigentlich als UTF-8 daherkommen sollte.

Über 30000 Dateien in ~2 Sekunden.

Rollo62 27. Mai 2020 13:59

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Zitat:

Zitat von Assarbad (Beitrag 1465481)
Hab das jetzt mal mit ripgrep in meinem Home-Verzeichnis durchexerziert:
Code:
rg -P '[^\x00-\x7FÄÖÜäöüß]'
... du kannst andere Zeichen zwischen ß und ] einfügen.

Ja dankesehr, ich habs mal noch etwas erweitert
Zitat:

[^\x00-\x7FÄÖÜäöüßéáÉÁÍèàìÈÀÌí°^*/'"–“”+#]
Es geht um Gedankenstrich statt Minus, um Varianten der Anführungszeichen und solcherlei Gemeinheiten.

Ich habe es mit GrepWin portable probiert, allerdings zeigt es nur die Zeilen und nicht das genaue Vorkommen des Zeichens an, leider nicht die genaue Position.

Es bleibt deshalb mühsam, ich werde mir wohl doch ein kleines Tool dazu schreiben müssen.

Sherlock 27. Mai 2020 14:14

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Ach, es geht darum es aus didaktischen Gründen selbst zu machen. Dann ist meine Lösung natürlich Mist.

Sherlock

Assarbad 27. Mai 2020 16:51

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Zitat:

Zitat von Sherlock (Beitrag 1465525)
Ach, es geht darum es aus didaktischen Gründen selbst zu machen. Dann ist meine Lösung natürlich Mist.

:lol:

Zitat:

Zitat von Rollo62 (Beitrag 1465520)
Es geht um Gedankenstrich statt Minus, um Varianten der Anführungszeichen und solcherlei Gemeinheiten.

Jupp, und alle "aktiven" Zeichen mußt du per Backslash auszeichnen ("escapen").

Zitat:

Zitat von Sherlock (Beitrag 1465525)
Ich habe es mit GrepWin portable probiert, allerdings zeigt es nur die Zeilen und nicht das genaue Vorkommen des Zeichens an, leider nicht die genaue Position.

Du meinst jetzt farblich das Vorkommen innerhalb der Zeile oder so?

Ansonsten probier doch mal PowerGREP. Das läßt sich für eine gewisse Zeit auch als Trialversion benutzen.

bjuergen 27. Mai 2020 18:28

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Hallo,
wie schon ein Vorredner geschrieben hat, schau dir mal Notepad++ an, da kannst du ganze Unterverzeichnisse auch mit Regulären ausdrücken durchsuchen und bekommst alle Stellen die dem Suchbegriff entsprechen angezeigt.

Jürgen

Rollo62 27. Mai 2020 19:17

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Danke an Alle für die vielen Vorschläge.

Ich werde jetzt wohl eine kleine Routine in den Code bauen, damit ich das Debuggen/Loggen kann.
Das im Code Suchen scheint doch Mehraufwand zu sein.

@Sherlock:
Ja, CodeFormat wäre machbar.
Aber ich nutze das eigentlich nicht, wharscheinlich erkenne ich dann meine Programme dannach nicht wieder :-D
So eine Taste drücke ich erst wenn ich genau weiss was hinten rauskommt,
nicht am produktiven Code.

Diese falschen Zeichen kamen wohl von Cut-and-Paste von ausländischen Seiten, Mails,
API-Referenzen, speziell aus chinesischen Dokumenten.
Die Chinesen kopieren anscheinend nicht nur Markenartikel,
sondern auch einzelne Font-Character, so das man den Unterschied nicht merkt :stupid:

Ich mache normalerweise Copy-and-Paste von Code und Kommentaren zuerst in meinen ASCII-Editor,
damit Formatierungen etc. raus sind.
Leider vergesse ich das schonmal, und die IDE meckert ja auch nicht.
Vielleicht wäre ein Clipboard-Cleaner ein schönes, neues Tool für das reine ASCII Text-Kopieren ohne Reue :stupid:

Sherlock 28. Mai 2020 08:12

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Der Formatter macht nix kaputt, habe ich im Rahmen unserer Validierung von externen Tools überprüft. Du kannst den Formatter ja an Deinen Stil anpassen. Ich habe mittlerweile Strg+D, Strg+S als Tastenfolge derart fest in mir drin, wenn ich einen Codeblock fertig habe, daß ich das manchmal in anderen Texteditoren anwende, was zu unerwünschten Ergebnissen führen kann. :lol:

Sherlock

Rollo62 28. Mai 2020 16:30

AW: Womit kann man versteckte Unicode/ASCII-Zeichen im Code finden ?
 
Ok, den Formatter schaue ich mir mal genauer an.

Ich habe halt etwas Ehrfurcht vor "Obfuskatoren" die im Quellcode automatisch rumgeistern.
Das würde ich eventuell in einem Unit ins Auge fassen, aber wohl erstmal nicht über 200 Units am Stück.
Da bin ich wohl etwas zu übervorsichtig never touch a running system) :stupid:


Ich habe übrigens das böse Zeichen gefunden,
durch Filtern im Code selbst, nach der Erzeugung der Daten.

Es war wohl das "°" = 0xB0 Grad-Zeichen was mich störte.
Das scheint das einzige ANSI Zeichen gewesen zu sein bei > 0x7F, was ich bei mir benutzt hatte.
Ich war aber davon ausgegengen nichts über 0x7F din zu haben.
Da muss ich wohl zur Strafe nochmal die ANSI-Tabelle auswendig lernen :-D


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