Unicode Chr()

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Unicode Chr()

Beitrag von Danilo »

Da die Funktion Chr() nur mit ASCII funktioniert, kann man damit keine
Unicode-Werte in einen String umwandeln.

Hier ein kleiner Code um das doch zu ermöglichen:

Code: Alles auswählen

CompilerIf #PB_Compiler_Unicode
  Procedure.s uChr(char)
    char$ = " "
    PokeW(@char$,char&$FFFF)
    ProcedureReturn char$
  EndProcedure

  Macro Chr(x)
    uChr(x)
  EndMacro
CompilerEndIf

A$ = "test "+Chr($20AC)+" "+Chr($FB30)+" "+Chr(23)+" "+Chr(70000)+" "+Chr($F000)

MessageRequester("Title",A$)
Damit kann man Unicode-Zeichen bis $FFFF benutzen. PB-Strings scheinen
im Unicode-Modus intern mit 2 Byte pro Zeichen zu arbeiten.

[X] Create unicode executable
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

sorry:

wenn man Create unicode executable aktiviert und Sorce codierung UTF-8 einstellt,
dann funktioniert Chr() mit 2byte....

Code: Alles auswählen

Debug Chr($0152)
kommt wohl auch auf den verwendeten Zeichensatz drauf an...

ich bekomme jedenfalls bei deinem code den identischen fensterinhalt auch ohne den CompilerIf-Block.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Kaeru Gaman hat geschrieben:sorry:

wenn man Create unicode executable aktiviert und Sorce codierung UTF-8 einstellt,
dann funktioniert Chr() mit 2byte....

Code: Alles auswählen

Debug Chr($0152)
kommt wohl auch auf den verwendeten Zeichensatz drauf an...

ich bekomme jedenfalls bei deinem code den identischen fensterinhalt auch ohne den CompilerIf-Block.
OK, Danke Kaeru Gaman.

Dann könnte es fast ein Bug von PureBasic sein, da die Funktionsweise von Chr()
nicht davon abhängen sollte in welchem Format der Source gespeichert wird,
sondern von der Einstellung "Create unicode executable".
Man kann schliesslich auch Unicode verwenden ohne es direkt im Source zu schreiben.
Entweder mit Chr(), aber auch mit DataSections, direkt Werte in Speicherbereiche schreiben usw.

Wenn ich in meinem Source absolut kein Unicode verwende, sondern Werte
zur Laufzeit des Programmes aus einer Datei einlese, dann macht es keinen
Sinn meinen Source in UTF8 abspeichern zu müssen.
Wenn ich ankreuze 'Create unicode executable', dann sollte das auch funktionieren,
egal wie der Source gespeichert ist.

In der Hilfe zu Chr() steht aber dass das Argument ein 'ASCII-Value' ist, also
von 0 bis 127. Daher ist es kein Bug - nur Werte bis 127 werden offiziell
unterstützt (sonst hätte ich es in die Bug-Sektion gepostet).
Wenns dann zufällig doch geht, je nachdem wie man den Source abspeichert,
kann man das nur "komisches Verhalten" nennen. :D
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo, da stimme ich dir zu. :D

es gibt so einiges an "komischem Verhalten" seit der 4.0
ich benutz auch noch 4.1, weil ich den vielen Nachbesserungen noch nicht so recht traue.

scheint fast, als ob Fred zur Zeit ne Riesenmenge neue Libs mit allem möglichen SchickMicki reinhaut,
und einige Details auf der Strecke bleiben.

...die standard-64bit-Argumente der DX-API kann man immer noch nicht nativ ansprechen, wa?
...nix halbes nix ganzes...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten