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.
Unicode und ich flippe aus
- 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
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
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

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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.
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.
- 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
>> 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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
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.
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.
- 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
Du kannst den String als ASCII in den Speicher poken und diese Adresse als Buffer angeben.
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
Code: Alles auswählen
meinstring.s = "Hallo"
meinstring_ascii.s = Space(Len(meinstring) / SizeOf(Character) + 1)
PokeS(@meinstring_ascii, meinstring, #PB_Any, #PB_Ascii)
von meinstring_ascii stehts in ASCII
Zeichen die nicht in ASCII passen, sind natürlich weg

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
