UTF-8-Problem unter Linux

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

UTF-8-Problem unter Linux

Beitrag von Omi »

Hallo!

Um dem 64-Bit-Problem meiner gestern veröffentlichen Programme und API-Libraries auf die Spur zu kommen hab ich u.a. die nicht ganz konsequent durchgezogene Wandlung der Strings für 'gtk_'-Funktionen in UTF-8 in Verdacht.

Folgendes Beispiel zeigt ein Problem das es eigentlich (nach Forumsbeiträgen) nicht geben sollte...

Code: Alles auswählen

ImportC ""
	gtk_widget_set_tooltip_text(*widget.GtkWidget, *text.p-utf8)
EndImport

EnableExplicit

; Object constants
#MainWin=0
#Text1= 0
#Text2= 1
#Text3= 2

#WinX=300
#WinY=200
#WinW=350
#WinH=100

Global.l gEvent, gQuit
Global   *gMem

Procedure AsciiToUTF8(SAscii.s)
	*gMem= AllocateMemory(StringByteLength(SAscii, #PB_UTF8) + 1)
	PokeS(*gMem, SAscii, -1,  #PB_UTF8)
	ProcedureReturn *gMem
EndProcedure


If OpenWindow(#MainWin, #WinX, #WinY, #WinW, #WinH, "Tooltips to show UTF-8-problem", #PB_Window_SystemMenu)
	TextGadget(#Text1, 5, 10, 290, 25, "Mouseover - pre-converted 2 UTF-8 with 'Umlauts'")
	TextGadget(#Text2, 5, 40, 290, 25, "Mouseover - not pre-converted with 'Umlauts'")
	TextGadget(#Text3, 5, 70, 290, 25, "Mouseover - not pre-converted without 'Umlauts'")

	gtk_widget_set_tooltip_text(GadgetID(#Text1), AsciiToUTF8("with UTF8-per-conversion ÄÖÜäöüß"))
	;*** Auf der nächsten Zeile gibts entkommentiert 'ungültigen Speicherzugriff' with 'Umlauts', trotz p-utf8 *** ...
	;gtk_widget_set_tooltip_text(GadgetID(#Text2), @"without UTF8-per-conversion, with 'Umlauts' ÄÖÜäöüß")
	gtk_widget_set_tooltip_text(GadgetID(#Text3), @"without UTF8-per-conversion, without Umlauts")
	FreeMemory(*gMem);                                         frees mem for UTF-8-conversion
	
	Repeat
		gEvent= WaitWindowEvent()
		
		Select gEvent
			Case #PB_Event_CloseWindow
				gQuit= #True
		EndSelect
		
	Until gQuit
EndIf
Aktiviert man den Tooltip des 2. Textes kommt es, vermtl. seitens PureBasic zu einem 'ungültigen Speicherzugriff' obwohl im Import p-utf8 gesetzt ist. Evtl. scheppert es schon vorher.

Hat jemand eine Ahnung wie dies korrekt behandelt werden sollte?
Das Beispiel auf #Text1 wäre doppelt-gemoppelt, funktioniert aber.

Gruß
Charly
PureBasic Linux-API-Library: http://www.chabba.de
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: UTF-8-Problem unter Linux

Beitrag von ts-soft »

Dein Import sollte so aussehen:

Code: Alles auswählen

ImportC ""
   gtk_widget_set_tooltip_text(*widget.GtkWidget, text.p-utf8)
EndImport
Also ohne *
Dann sollteste Dir die Procedure AsciiToUTF8() einfach sparen und das FreeMemory() auch,
welches sowieso nur den zuletzt verwendeteten Speicher freigegeben hat und nicht allen
reservierten!

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
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: UTF-8-Problem unter Linux

Beitrag von Omi »

Das heißt in der Praxis, per Pseudotyp p-utf8 wird ein übergebener String in UTF-8 gewandelt und in einen Pointer oder besser die Adresse in Integer übergeben. Dies kann ich aus der PB-Dokumentation nicht so ganz ersehen.

Für ein 'best match' sollten die stringverarbeitenden API-Routinen also dahingehend modifiziert und evtl. die internen PB-API per Nutzung des ImportC umgangen werden, um möglichst kompatibel und 'sicher' zu programmieren.
Jetzt wirds stressig aber lehrreich. Kein Wunder dass sich bisher keiner an die API-Sammlung getraut hat, und ich Naivling ... :lol:
Und dann hoffen, ein PB-Update bügelt dieser Probleme nicht demnächst mal aus :|

Du hast mir bisher sehr 'auf den Punkt' geholfen, Danke Dir
Grüße

PS:
Bin dann bis Weihnachten erst mal versorgt :lol:
PureBasic Linux-API-Library: http://www.chabba.de
Antworten