Unicode und ich flippe aus

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Das ist ebenfalls nicht 100%ig richtig. Bei UTF-8 ist ein zeichen solange 1byte groß, solange es aus dem ascii bereich kommt. Ist es nicht im ascii enthalten, dann ist es 2byte groß.

Das macht die größeneinschätzung ein wenig komplizierter, weil man nicht einfach die bytes zählen kann um festzustellen, aus wievielen zeichen ein string besteht. Len() macht das aber zum glück selbstständig.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

PB unterstützt ja in dem Sinne kein UTF-8. Die normale Stringverwaltung
benutzt entweder ANSI oder Unicode, je nach Compilereinstellung. Lediglich
Konvertierungsmöglichkeiten für UTF-8 sind vorhanden. Desweiteren kann
die IDE UTF-8 nutzen, so das den Strings bei Unicode-Compilierung nichts
verloren geht.

Mit anderen Worten, PB-Strings enthalten entweder Ansi-Strings oder
Unicode-Strings.

UTF-8 wird z.B. beim Text einlesen im ANSI-Modus zu ANSI und im Unicode-Modus zu Unicode.

Falls das falsch ist, bitte korrigiert mich :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Bist du dir da sicher? UTF-8 *ist* ein Unicodeformat. Es gibt UTF-8 und UTF-16 (und UTF-32 iirc, was aber wohl ziemlicher Quatsch ist). Der unterschied ist, dass in UTF-16 ein zeichen immer in 16 bit gespeichert wird.

Ich dachte ich würde mich an einen Thread im englischen Forum erinnern, in dem Fred erklärt hatte, dass er UTF-8 als codierung nimmt, was nur dann mehr als 1 Byte speicher verwendet, wenn das entsprechende Zeichen ausserhalb des ascii bereiches liegt... kann mich aber auch irren.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Bist du dir da sicher?
Nein, natürlich nicht sicher. Aber SizeOf(charachter) hat in Unicodemodus
immer 2. Speicher wird auch immer der doppelte gebraucht. Sollte ja die
Ausnahme sein bei UTF-8. Also mehr eine naheliegende Vermutung.

Und peeken muß man ja auch mit #PB_Unicode und nicht mit #PB_UTF8
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

UTF-8 wird nur zum Konvertieren und lesen halbwegs unterstützt. Standard
auf Windows ist UCS-2 für Unicode, also immer 2 Bytes pro Charakter.
PB unterstützt als eigene Strings nur UCS-2 und ASCII, für UTF-8 gilt so
lange 1 Byte pro Char, bis der ASCII-Wert grösser als 127 ist (z. B. auch
'ä', 'ö', etc.).

Hab den Thread zwar nicht ganz gelesen, aber ich glaube das beantwortet
ein paar Unklarheiten.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Beitrag von Sven »

Kann man eigentlich ein Programm im Unicode-Modus erstellen und trotzdem einige Strings in ASCII haben? Wenn ich Zeichen über die serielle mit MVCOM sende, brauche ich einen ASCII-String...

Sven
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Du kannst den String als ASCII in den Speicher poken und diese Adresse als Buffer angeben.

Code: Alles auswählen

meinstring.s = "Hallo"
meinstring_ascii.s = Space(Len(meinstring) / SizeOf(Character) + 1)
PokeS(@meinstring_ascii, meinstring, #PB_Any, #PB_Ascii)
meinstring kann jetzt irgendwas sein (UNICODE oder ASCII), im Speicher
von meinstring_ascii stehts in ASCII
Zeichen die nicht in ASCII passen, sind natürlich weg :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Kurz zur Info: freaks Anmerkung wegen fehlerhafter Beschreibung im Handbuch ist für nächstes Update der Hilfe vorgemerkt.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Antworten