Verständnis-StringPointer/Bytelänge "Text" ASCII o. UNICODE?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Verständnis-StringPointer/Bytelänge "Text" ASCII o. UNICODE?

Beitrag von Toshy »

Hallo.

Ich bin in der Hilfe und ihm Forum nicht fündig geworden und es ist lange her, seit ich mich damit beschäftigte.

1.
Wenn ich im Programmcode einen Text eingebe und auf diesen per Pointer mit @ Zugreife, wie lang ist der Speicherbereich dann je Buchstabe?

Code: Alles auswählen

Debug @">"
Debug PeekB(@">")
Debug PeekB(@">"+1)
Debug PeekC(@">")
Ich nutze jetzt PB 5.51.
Wird der Text als ASCII mit einem Zeichen gespeichert oder als UNICODE mit zwei? Es scheint laut Hilfe wohl in einer der letzten Versionen eine kleine Änderung gegeben zu haben, ob die sich auswirkt und wie es vorher war weiß ich nicht.
Falls, was ich vermute, die IDE auch Unicodezeichen verarbeiten kann, dann sollte es Char mit zwei Byte sein. Der Textcode oben ist mir nicht hilfreich, da ich nicht sicher weiß wie die "Unicodetabelle" und die Bytebelegung ist.

2.
Es geht mir darum mit (z.b.)

Code: Alles auswählen

CompareMemory(*Position, @">", 1)
einen Speicherbereich zu vergleichen. Dabei gehe ich in Ein-Byte-Schritten vor. *Positon ist je ein Byte aus einem Text (Teils HTML), das aber auch NULL-bytes erkennen soll. daher der pointervergleich. Die Tagzeichen sind soweit ich weiß immer ein Byte groß.
FALLS, was ich vermute, ">" somit zwei Byte nutzt (mit 1 Byte auslesen bei dem Zeichen bisher keine Probleme, das heißt aber nichts), wie kann ich das direkt abfangen?

also konvertieren oder so. Eine extra If-Abfrage und auslesen per peek usw möchte ich nicht.
Als Umgehung mit einer neuen Variable könnte bzw. sollte es wohl so gehen:

Code: Alles auswählen

AsciiVar.a = peekc(@">")
CompareMemory(*Position, @AsciiVar, 1)
wenn ich die Ausgabe von

Code: Alles auswählen

*Ascii = Ascii("Hélé")
  ShowMemoryViewer(*Ascii, 4)
mit

Code: Alles auswählen

 ShowMemoryViewer(@"Hélé", 4)
und

Code: Alles auswählen

 ShowMemoryViewer(@"Hélé", 8)
vergleiche bin ich mir auch nicht sicher.

Damit ich sicher sein kann, wie läuft das ab, wie sollte ich es machen? Bisher klappt das zwar, nur vermute ich ist es glück.

Danke
Toshy
1. Win10
PB6.1
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Verständnis-StringPointer/Bytelänge "Text" ASCII o. UNIC

Beitrag von Bisonte »

Ab der 5.5 ist aus mit ASCII... Alles intern in Unicode. Auch normaler Text in Stringvariablen...

Somit ist alles was du per @Hallo$ einsetzt immer Unicode sprich 2 Bytes pro Zeichen.

Mit der Ascii() Funktion fährst du bei deinem 1 Byte Verfahren auf der sicheren Seite, solange du nur mit AsciiZeichenketten
hantierst.

P.S. : Dabei auch immer schön dran denken, dass man den Speicher den man mit Ascii() erhält auch wieder freigibt ... ;)
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Verständnis-StringPointer/Bytelänge "Text" ASCII o. UNIC

Beitrag von NicTheQuick »

SizeOf(Character) gibt an wie wie viele Bytes ein Zeichen in einem String beansprucht. Das funktioniert mit neuen und alten Versionen.
Bild
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Re: Verständnis-StringPointer/Bytelänge "Text" ASCII o. UNIC

Beitrag von Toshy »

herzlichen Danke

Dann noch mal nachgefragt zu peekS()und poke(S)

Code: Alles auswählen

Text$ = PeekS(*Speicherpuffer [, Länge [, Format]])
Beschreibung

Liest einen String von der angegebenen Speicheradresse. 
Parameter

*Speicherpuffer Die Adresse, von der gelesen werden soll.  
Länge (optional) Die maximale Anzahl an zu lesenden Zeichen ("Character"). Wenn dieser Parameter nicht angegeben wird oder -1 verwendet wird, dann gibt es kein Maximum. Der String wird gelesen, bis ein abschließendes Null-Zeichen auftritt, oder die maximale Länge erreicht wird.  
Format (optional) Das beim Lesen des Strings zu verwendende String-Format. Dies kann einer der folgenden Werte sein: 
  #PB_Ascii  : Liest die Strings als ASCII
  #PB_UTF8   : Liest die Strings als UTF8
  #PB_Unicode: Liest die Strings als Unicode (Standard)

kombiniert mit einem der folgenden Werte: 
  #PB_ByteLength: nur gültig bei Verwendung des #PB_UTF8 Flags, die 'Länge' wird Bytes darstellen (nicht 'Character'-Zeichen).
                  Dies kann nützlich sein, da UTF8 variable Zeichen-Längen ('Character') hat.
Wie sieht es mit mit der Nutzung von

UTF16 aus? z.B. beim HTML gibt es nach HTML5 drei bzw. vier Standarteinstellungen, UTF-8, ASCII, aber auch Little-endian UTF-16 und Big-endian UTF-16. UTF-16 ist ja auch ein Unicode-Kodierungsformat, nur halt mit variabler Länge. Big oder Little ist ja nur ein vertauschen der Bytereihenfolge.

Wie kann ich das theoretisch verarbeiten?

Und muß manuell aus HTML und so weiter selbst Stellen raus lesen, ein wenig parsen auf der Suche nach etwas im Code.

An sich habe ich noch andere Probleme beim Verständnis des HTML5 Aufbaus in Bezug auf UTF-8 und UTF-16, aber unanghängig davon muß ich sowieso wissen wie man das verarbeiten müßte.

Nebenbei, falls es zufällig jemand weiß, eine HTML5 Datei / Seite sollte / kann einen BOM haben. UTF-8, UTF-16 als Big oder Little oder halt fehlende Angabe. Was ich noch nicht rausgefunden habe ist, worauf sich das dann bezieht. Also auf alles, oder nur Inhalte. Sind also Steuerzeiche (<>=...) immer im Ascii bzw. mit einem Byte belegt und auch Tagnamen.
Auf Grund der Beschreibungen im Internet vermute ich, das das Grundgerüst immer ASCII sein könnte / müßte, einfach weil immer vom Byteweisen auslesen (an diesen Stellen wird nicht vom Char geredet) und ASCII-Zeichen "<" gesprochen. Ich muß dann halt schauen, wo und wie ich auslese.

An sich ist jetzt aber erst mal das mit dem Speicherauslesen wichtig, dann kann ich auch etwas testen.

Gruß
Toshy
1. Win10
PB6.1
Antworten