ascii und unicode

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
JMaker
Beiträge: 102
Registriert: 19.01.2015 10:18

ascii und unicode

Beitrag von JMaker »

Was ist der unterschied zwischen ascii und unicode? Oft las ich in der Hilfe. Ich erfuhr das ascii ein byte groß ist
und ein unicode zwei bytes für mehr verfügbare zeichenauswahl. wenn diese info falsch ist bitte mich berichtigen. danke
aber wenn ich ein unicode string habe und möchte nach ascii wie mache ich das?
wie kann ich n String von ascii nach unicode und wieder zurück konvertieren?
Ich benutze Pure Basic 5.30 auf Microsoft Windows 7.
Gruß
JM
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ascii und unicode

Beitrag von NicTheQuick »

Wenn du in den Compiler-Optionen z.B. Unicode aktiviert hast, dann sind automatisch alle Strings in deinem Programm Unicode. Du kannst dann also nicht die normalen Stringfunktionen nutzen um Ascii-Strings zu manipulieren.
Aber Purebasic hilft dir an vielen Stellen damit mit beiden zurecht zu kommen. Zum Beispiel kannst du aus einer Ascii-Datei lesen, indem du bei 'ReadString()' das Flag '#PB_Ascii' setzt. Damit wird der String im Ascii-Modus aus der Datei gelesen, liegt aber nach der Zuweisung in eine String-Variable als Unicode-String vor. Das selbe geht natürlich auch umgekehrt und mit 'WriteString()'.
Möchtest du jetzt manuell einen Unicode-String in seine Ascii-Version konvertieren, helfen dir dabei 'PeekS()' und 'PokeS()'.

Code: Alles auswählen

Procedure hexDump(*buffer.Ascii, length.i)
	Protected dump.s = Hex(*buffer, #PB_Integer) + " "
	Protected i.i = 0
	While i < length
		dump + RSet(Hex(*buffer\a, #PB_Ascii), 2, "0") + " "
		i + 1
		If i % 8 = 0
			dump + #LF$ + Hex(*buffer, #PB_Integer) + " "
		EndIf
		*buffer + 1
		
	Wend
	Debug dump
EndProcedure

Define s.s = "Dies ist ein Test-String!"
Debug #DQUOTE$ + s + #DQUOTE$
Define.i length = Len(s)
Debug "Er besteht aus " + length + " Zeichen."
Define.i size = (MemoryStringLength(@s) + 1) * SizeOf(Character)
Debug "Er verbraucht " + size + " Bytes im Speicher."
Debug "Das ist sein Hexdump:"
hexDump(@s, size)

CompilerIf #PB_Compiler_Unicode
	Define *buffer = AllocateMemory((length + 1) * SizeOf(Ascii))
	PokeS(*buffer, s, -1, #PB_Ascii)
	Debug "Konvertiert in Ascii sieht er so aus:"
	hexDump(*buffer, (length + 1) * SizeOf(Ascii))
CompilerElse
	Define *buffer = AllocateMemory((length + 1) * SizeOf(Unicode))
	PokeS(*buffer, s, -1, #PB_Unicode)
	Debug "Konvertiert in Unicode sieht er so aus:"
	hexDump(*buffer, (length + 1) * SizeOf(Unicode))
CompilerEndIf
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

Re: ascii und unicode

Beitrag von ts-soft »

Da der Compiler Schalter für ASCII bald rausfliegt, solltest Du bei neuem Code nur noch Unicode verwenden.
ASCII kann man dann zur Not noch im Speicher halten, bzw. mit Pseudotypes andere Libs verwenden.

Desweiteren sollte die IDE bei Dateiformat immer auf UTF-8 stehen.

Gruß
Thomas
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
Antworten