Seite 1 von 1

ascii und unicode

Verfasst: 20.01.2015 14:59
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?

Re: ascii und unicode

Verfasst: 20.01.2015 15:33
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

Re: ascii und unicode

Verfasst: 20.01.2015 16:13
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