Seite 1 von 2

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

Verfasst: 27.02.2015 18:38
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

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

Verfasst: 28.02.2015 11:44
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

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

Verfasst: 28.02.2015 13:17
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)

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

Verfasst: 28.02.2015 14:50
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)

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

Verfasst: 28.02.2015 15:34
von Vera
Danke Sicro

dann fehlt jetzt nur noch der Check, ob es auch auf x86 inzwischen ok ist.

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

Verfasst: 28.02.2015 17:49
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)

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

Verfasst: 01.03.2015 02:52
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

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

Verfasst: 01.03.2015 12:04
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

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

Verfasst: 01.03.2015 12:13
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.

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

Verfasst: 01.03.2015 17:39
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.