Bug/Feature? FindString() + #PB_String_NoCase m. Umlauten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Bug/Feature? FindString() + #PB_String_NoCase m. Umlauten

Beitrag von Omi »

Hallo,

wie ich bemerkt habe wird bei FindString() mit Flag #PB_String_NoCase bei Umlauten doch
auf Klein-/Großschreibung unterschieden. Scheinbar auch mit fränzösischen 'Umlauts'.

Getestet auf einigen Linux: Lubuntu, Xubuntu, Ubuntu, Mint auf Unicode- und Ascii-Executables.

Da die Umlaute ja zum jeweiligen Standard-Alphabet gehören und man eigentlich nicht noch zusätzliche eine Sonderbehandlung nachschieben will und diesbezüglich auch ein verlässliches Verhalten erwartet würd ich dies als Bug sehen.

Wie seht Ihre das?

Ein Beispiel:

Code: Alles auswählen

;Linux, PB 5.22, 5.30, 5.31
;FindString mit Flag '#PB_String_NoCase'
;Probiere kleine und große Buchstaben (z.B. h|H) UND
;probiere kleine und große Umlaute (z.B. ä|Ä oder französich é|É)

EnableExplicit

#MainWin= 0
#LIG = 0
#Txt = 1
#Txt1= 2
#Str = 3

Global.i gEvent, gQuit
Global.s Dim Zeile(23)

Procedure Itm_Search(Window, tGadget, sGadget, S.s, NextItem)
	Protected.i I, First= #Null, Found= -1
	If S= #NULL$ : ProcedureReturn : EndIf
	For I= First To CountGadgetItems(tGadget)- 1
		If FindString(GetGadgetItemText(tGadget, I, 0), S, 1, #PB_String_NoCase); here's this Feature OR Problem
			SetGadgetState(tGadget, I)
			Found= I
			Break
		EndIf
	Next I
EndProcedure

Procedure CreateWindow_Main()
	Protected.i I, O

	If OpenWindow(#MainWin, 200, 200, 350, 400, "FindString w. 'Umlauts' and #PB_String_NoCase", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
		ListIconGadget(#LIG, 5, 50, 340, 335, "column 1", 100, #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
		TextGadget(#Txt,  5, 7, 250, 20, "try searchterm with big/small 'Umlauts' like")
		TextGadget(#Txt1, 5, 27, 250, 20, "ä|Ä, ö|Ö, ü|Ü, é|É (=´+e|´+E)")
		StringGadget(#Str, 260, 22, 80, 26, "")
		
		Restore Names
		For I= 0 To 23 : Read.s Zeile(I) : Next I
		
		For I= 0 To 23
			AddGadgetItem(#LIG, -1, Zeile(I))
		Next I
	EndIf
EndProcedure

CreateWindow_Main()

Repeat
	gEvent= WaitWindowEvent()
	
	Select gEvent
		Case #PB_Event_CloseWindow
			gQuit= #True
		Case #PB_Event_Gadget
			If EventGadget()= #Str
				If EventType()= #PB_EventType_Change
					Itm_Search(#MainWin, #LIG, #Str, GetGadgetText(#Str), #False)
				EndIf
			EndIf
	EndSelect
	
Until gQuit
End

DataSection
	Names:
	Data.s "Bauer", "Müller", "Meier", "Maier", "Huber", "Schmidt", "Schreiner", "Gérard", "Bach", "Binder",
	       "Hofer", "Schneider", "Bader", "Berger", "Klein", "Groß", "Kaiser", "König", "Émirats", "Saint-Étienne", "Zäuner",
	       "Ärgermacher", "Österreicher", "Überhuber"
EndDataSection
Grüße - Charly
Zuletzt geändert von Omi am 28.02.2015 11:46, insgesamt 1-mal geändert.
PureBasic Linux-API-Library: http://www.chabba.de
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: Bug/Feature? FindString() + #PB_String_NoCase m. Umlaute

Beitrag von Omi »

Hi nochmal.

Das Problem tritt nicht unter Windows-XP auf (Mac konnte ich nicht testen).
Umlaute werden unter Windows bei FindString() mit Flag #PB_String_NoCase unabhängig von Klein-/Großschreibung erkannt.

Damit dürfte es wohl eindeutig ein Fehler auf Linux sein.

Ich werd's im englischen Forum posten!

Gruß - Charly
PureBasic Linux-API-Library: http://www.chabba.de
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Bug/Feature? FindString() + #PB_String_NoCase m. Umlaute

Beitrag von Vera »

Hallo Charly,

hier hab mich auch mal umgesehen, und das Problem ist wohl auch schon reichlich alt und für Windows wurde es wohl zwischendurch mal gefixed.

Auch denke ich , dass es mit einem möglicherweise darunter liegendem LCase und UCase zu tun hat, den folgendes funktioniert bei mir auch nicht:

Code: Alles auswählen

Debug LCase("A B C Ä Ö Ü É ´ Ç Å")   ; -> a b c Ä Ö Ü É Ž Ç Å
Debug UCase("a b c ä ö ü é à ç å")   ; -> A B C ä ö ü é à ç å
Kannst Du das für die PB 5.31 bestätigen ?
... und wenn ja, sollte man das dann nicht auch der Bugmeldung hinzufügen?

Liebe Grüße ~ Vera

Ich lass mal 3 interessante Threads hier:
- Feature Requests: #PB_String_NoCase For FindString() - October 2008 :wink:
- [×] Unicode conversion... 2009
- German umlauts in LCase And UCase? - 2006 (incl. warpper-tool)
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
Sicro
Beiträge: 968
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Bug/Feature? FindString() + #PB_String_NoCase m. Umlaute

Beitrag von Sicro »

Unter meinem Linux:

Code: Alles auswählen

LCase("A B C Ä Ö Ü É ´ Ç Å")   ; -> a b c ä ö ü é ´ ç å
UCase("a b c ä ö ü é à ç å")   ; -> A B C Ä Ö Ü É À Ç Å
Test-Code:

Code: Alles auswählen

Define.s txt1, txt2, txt

txt1 = LCase("A B C Ä Ö Ü É ´ Ç Å")
txt2 = UCase("a b c ä ö ü é à ç å")

txt = "LCase(" + #DQUOTE$ + "A B C Ä Ö Ü É ´ Ç Å" + #DQUOTE$ + ")   ; -> " + txt1 + #LF$ +
      "UCase(" + #DQUOTE$ + "a b c ä ö ü é à ç å" + #DQUOTE$ + ")   ; -> " + txt2

SetClipboardText(txt)
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Bug/Feature? FindString() + #PB_String_NoCase m. Umlaute

Beitrag von Vera »

Danke Sicro

dann fehlt jetzt nur noch der Check, ob es auch auf x86 inzwischen ok ist.
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: Bug/Feature? FindString() + #PB_String_NoCase m. Umlaute

Beitrag von Omi »

Sodele,

erstmal vielen Dank an Euch fürs Testen und die weiteren Hinweise!
Hallo Vera, Du findest aber auch alles - hätte selber schon ein bisschen gestöbert, aber :roll:

Ich wollte eigentlich was Wichtigeres tun, hab aber nochmal fleissisch getestet mit PB V5.31,x68/x86 unter:
Linux:
xubuntu 32-Bit, V13.10
xubuntu 32-Bit, V14.04
kubuntu 64-Bit, V13.10
lubuntu 32-Bit, V14.04
ubuntu 64-Bit, V13.10
Mint 64-Bit, V17.0 (17.1)

Es stellte sich folgendes heraus:

- Eure LCase- und UCase-Wandlungen von Umlauten wurden auf allen Distributionen:
> im Ascii-Modus nicht durchgeführt
> im Unicode-Modus korrekt ausgeführt

- Das FindString(, , , #PB_String_NoCase) funktionierte für Umlaute auf allen Distris:
> weder im Ascii-Modus
> noch im Unicode-Modus
Also Komplettausfall!

- Zudem hab ich gemerkt, dass auch SortList(, #PB_Sort_NoCase) und SortStructuredList(, #PB_Sort_NoCase, ...) sich bei Umlauten falsch verhält verhält:
> im Ascii-Modus wird nicht korrekt sortiert
> im Unicode-Modus wird korrekt sortiert

- Für SortArray(, #PB_Sort_NoCase) und SortStructuredArray(, #PB_Sort_NoCase,...) nochmals ein anderes verhalten:
> im Ascii-Modus wird nicht korrekt sortiert
> im Unicode-Modus wird teilweise nicht korrekt sortiert (französische Umlaute falsch, alle ???)

Die Mac-Ergebnisse werde ich nachtragen.

Noch ein kleines Beispiel zum SortList()-Problem:

Code: Alles auswählen

;Umlautproblem with SortList(List(), #PB_Sort_NoCase)

Global NewList Terms.s()
AddElement(Terms())
Terms()= "änderung"
AddElement(Terms())
Terms()= "Émirats"
AddElement(Terms())
Terms()= "Änderung"
AddElement(Terms())
Terms()= "émirats"
AddElement(Terms())
Terms()= "änderung"
AddElement(Terms())
Terms()= "Émirats"
AddElement(Terms())
Terms()= "Änderung"

SortList(Terms(), #PB_Sort_NoCase)

ForEach Terms()
	Debug Terms()
Next
Und eines zum SortArray()-Problem:

Code: Alles auswählen

;Umlautproblem with SortArray(ArrayName(), #PB_Sort_NoCase)

Global.i I
Global Dim Terms.s(6)
Terms(0)= "änderung"
Terms(1)= "Émirats"
Terms(2)= "Änderung"
Terms(3)= "émirats"
Terms(4)= "änderung"
Terms(5)= "Émirats"
Terms(6)= "Änderung"

SortArray(Terms(), #PB_Sort_NoCase)

For I= 0 To ArraySize(Terms())
	Debug Terms(I)
Next
Das Problem könnte sich auch noch ausweiten auf:
- SortStructuredList()
- SortStructuredArray()
hab aber hier noch nix versucht!

Dann wart ich vor der Meldung nochmal auf ewaige Bestätigungen oder anderweitige Erfahrungen.

Danke und viele Grüße - Charly

PS:
- Edit (Problem auch in SortArray(), siehe Ergänzung oben)
- 01.03.2015 - 17:45 Aktualisiert (noch ohne Mac)
Zuletzt geändert von Omi am 01.03.2015 18:43, insgesamt 2-mal geändert.
PureBasic Linux-API-Library: http://www.chabba.de
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Re: Bug/Feature? FindString() + #PB_String_NoCase m. Umlaute

Beitrag von Andreas21 »

Unter Mac OSX 10.10.2 mit PB 5.31 X64
LCase("A B C Ä Ö Ü É ´ Ç Å") ; -> a b c Ä Ö Ü É ´ Ç Å
UCase("a b c ä ö ü é à ç å") ; -> A B C ä ö ü é à ç å
Umlautproblem with SortList(List(), #PB_Sort_NoCase)
Änderung
Änderung
Émirats
Émirats
änderung
änderung
émirats
Umlautproblem with SortArray(ArrayName(), #PB_Sort_NoCase)
Änderung
Änderung
Émirats
Émirats
änderung
änderung
émirats
Unter Mac OSX 10.10.2 mit PB 5.31 X32
LCase("A B C Ä Ö Ü É ´ Ç Å") ; -> a b c Ä Ö Ü É ´ Ç Å
UCase("a b c ä ö ü é à ç å") ; -> A B C ä ö ü é à ç å
Umlautproblem with SortList(List(), #PB_Sort_NoCase)
Änderung
Änderung
Émirats
Émirats
änderung
änderung
émirats
Umlautproblem with SortArray(ArrayName(), #PB_Sort_NoCase)
Änderung
Änderung
Émirats
Émirats
änderung
änderung
émirats
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Bug/Feature? FindString() + #PB_String_NoCase m. Umlaute

Beitrag von helpy »

Hallo zusammen,

Das Umwandeln von Klein- nach Großschreibung und umgekehrt ist nicht so trivial wie man meinen könnte.

Im deutschen gibt es für das kleine "i" (mit I-Punkt) ein großes "I" (ohne I-Punkt).

Im türkischen ist das anders, denn da gibt es zwei verschiedene "I" (mit und ohne I-Punkt):
  • "i" (klein mit I-Punkt) <--> "İ" (groß MIT I-Punkt)
  • "ı" (klein ohne I-Punkt) <--> "I" (groß OHNE I-Punkt)
D.h. Man braucht für die Konvertierung Klein <--> Groß ein sogenanntes Case-Mapping, und das für jede Sprache.

Siehe Case Mappings oder auch ICU User Guide -- Case Mappings.

LG,
Guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Bug/Feature? FindString() + #PB_String_NoCase m. Umlaute

Beitrag von Danilo »

helpy hat geschrieben:D.h. Man braucht für die Konvertierung Klein <--> Groß ein sogenanntes Case-Mapping, und das für jede Sprache.
Das haben Betriebssysteme i.d.R. eingebaut und bieten eine simple Funktion dafür an,
die Entwickler (oder PB) aufrufen können.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Sicro
Beiträge: 968
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Bug/Feature? FindString() + #PB_String_NoCase m. Umlaute

Beitrag von Sicro »

Ascii-Modus:
SortList(Terms(), #PB_Sort_NoCase)
SortArray(Terms(), #PB_Sort_NoCase)
SortStructuredList(Terms(), #PB_Sort_NoCase ...)
SortStructuredArray(Terms(), #PB_Sort_NoCase ...)

Code: Alles auswählen

Änderung
Änderung
Émirats
Émirats
änderung
änderung
émirats
Unicode-Modus:
SortList(Terms(), #PB_Sort_NoCase)
SortStructuredList(Terms(), #PB_Sort_NoCase ...)

Code: Alles auswählen

änderung
Änderung
änderung
Änderung
Émirats
émirats
Émirats
Unicode-Modus:
SortArray(Terms(), #PB_Sort_NoCase)
SortStructuredArray(Terms(), #PB_Sort_NoCase ...)

Code: Alles auswählen

änderung
Änderung
änderung
Änderung
Émirats
Émirats
émirats

Code: Alles auswählen

Structure ListStruc
  Temp.s
  Text.s
EndStructure

Global NewList Terms.ListStruc()
AddElement(Terms())
Terms()\Text = "änderung"
AddElement(Terms())
Terms()\Text = "Émirats"
AddElement(Terms())
Terms()\Text = "Änderung"
AddElement(Terms())
Terms()\Text = "émirats"
AddElement(Terms())
Terms()\Text = "änderung"
AddElement(Terms())
Terms()\Text = "Émirats"
AddElement(Terms())
Terms()\Text = "Änderung"

SortStructuredList(Terms(), #PB_Sort_NoCase, OffsetOf(ListStruc\Text), #PB_String)

ForEach Terms()
  Debug Terms()\Text
Next

Code: Alles auswählen

Structure ArrayStruc
  Temp.s
  Text.s
EndStructure

Global.i I
Global Dim Terms.ArrayStruc(6)
Terms(0)\Text = "änderung"
Terms(1)\Text = "Émirats"
Terms(2)\Text = "Änderung"
Terms(3)\Text = "émirats"
Terms(4)\Text = "änderung"
Terms(5)\Text = "Émirats"
Terms(6)\Text = "Änderung"

SortStructuredArray(Terms(), #PB_Sort_NoCase, OffsetOf(ArrayStruc\Text), #PB_String)

For I= 0 To ArraySize(Terms())
  Debug Terms(I)\Text
Next
Getestet wurde unter meinem Linux.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten