AutoIt / SciTE / Probleme mit code.page ANSI UTF8 / ss und ß / _ArraySearch

  • Hallo Experten,

    ich habe ein Problem.
    Ich bin mit AutoIt nicht in der Lage ein ss von einem ß zu unterscheiden.

    Außerdem habe ich Darstellungsprobleme in SciTE:


    Hier einmal ein paar Ausgaben:


    Hier nochmal:


    zu beachten sind hier die Unterschiede bei den ÄÖÜäöüß.
    Bei dem einen wird das ß in den ersten Zeilen verändert:
    >Running AU3Check (3.3.14.2) from:S:\Programmierung\AutoIt\Programme\AutoIt3 input:S:\Programmierung\Scripte\_am Entwickeln\Movie DB Info\_GENUTZTES\ausser_außer.au3
    Bei dem anderen wird es in meinem Ausgaben geändert:
    Interessante Ausgaben: R???


    Aber das es in beiden Fällen richtig läuft bekomme ich nicht hin.
    SciTE und AutoIt habe ich quasi frisch installiert.

    Wenn ich mit einerm Editor die .array Datei öffne, dann kann ich ausser und außer nur bei der ANSI codierten Datei unterscheiden.


    Was ich in der SciTE GlobalConfig gefunden habe:


    Ich denke ich habe ein Problem mit dem UTF8 und ANSI...

    Code
    Auto2Exe /ANSI
    --> ???
    AutoItWrapper Directive
    --> #AutoIt3Wrapper_UseAnsi=y
    --> - Skipping #AutoIt3Wrapper_UseAnsi directive because ANSI is not supported anymore.
  • Für diesen Zweck solltest du UTF 16 Little Endian nehmen:

  • Auch mit der UTF 16Little Endian scheint bei mir im SciTE ausser und außer gleich zu sein.
    Wenn ich mit STRG+F nach "auss" suche, markiert er mir "auss" und "auß".

    Des weiteren ist die Ausgabe bei mir auch identisch, beides mal findet Search die gleiche Zeile und nicht die unterschiedliche, obwohl ich einmal nach "ausser" suche und das andere mal nach "außer".

    Die Ausgabe wird bei mir dann auch wieder ordentlich falsch Dargestellt.:(
    Ich bin mit meinem Latain am Ende und hoffe auch euch.

    • Offizieller Beitrag

    code.page=0

    ScriptDatei: UTF8 without BOM

    Das passt nicht zusammen. Wieso ist deine Skriptdatei UTF8wB, wenn deine Standardeinstellung für SciTE "locale settings" (bei Standard-Windows ist das i.A. Win1252) ist? Hast du in deinem Skript eine Encoding-Zeile eingetragen, oder wurde das Skript mit einem anderen Editor erstellt?
    Es ist etwas unglücklich, dass die Settings von SciTE keinen einheitlichen Zeichensatz festlegen (ich hätte UTF-8 bevorzugt), sondern sich an den lokalen User-Einstellungen orientieren. Bringt immer viel "Spaß", wenn man Skripte aus anderen Teilen der Welt in die Finger bekommt.

  • Ich habe bewusst mit Notepad++ das Codepage der Datei verändert um den Fehler vielleicht eingrenzen zu können.

    Mir ist im Notepad++ und im SciTE aufgefallen:
    - mit UTF8 + UTF16 --> dass ich mit STRG+F nach "auss" suche, markiert er mir "auss" und "auß".
    - mit ANSI --> dass ich mit STRG+F nach "auss" suche, markiert er mir "auss" und NICHT die "auß".


    Daher war meine Annahme, dass das _ArrayBinarySearch und _ArraySearch Probleme mit der Codepage hat und daher ein ss nicht vom ß unterscheiden kann.

    AutoIt unterscheidet dann im Betrieb wohl die Datei-Codepage nicht mehr sonderlich...

  • Ich habe das Problem bisher nicht lösen können.

    1. _ArraySearch und _ArrayBinarySearch können kein ß vom ss unterscheiden.
    11--> Hier habe ich ja mein Testscript oben gepostet, bei dem gut ersichtlich immer der gleiche Index gefunden wird, obwohl einmal ein ss und einmal ein ß gesucht wird.

    2. Richtige Codepage im SciTE, ich hätte am liebsten ANSI, denn dort kann ich mit der Suchfunktion (STRG+F) zumindest ein ß vom ss unterscheiden. Mit allen UTF Codepages leider nicht.
    22--> Hier habe ich ja meine Ausgaben gepostet. Leider sieht es immer noch genau so aus. Ich habe keine weitere Ideen.

    3. Anzeige wird beim kompilieren der Scripte im SciTE und später auch in dem CommndLine nicht richtig angezeigt.

    Sollte ich mein Problem mal im englischen Forum melden?

  • Teste mal, ob das bei dir funktioniert...

    Spoiler anzeigen
  • Hier schon einmal meine Ausgabe.
    Jetzt gehe ich dabei und versuche zu verstehen was passiert.

    Spoiler anzeigen

    Okay, 1:
    Meine SciTE\SciTEUser.properties ist komplett leer, wo bekomme ich eine DEFAULT her?
    Diese liegt bei mir auch in dem SciTE-Install-Ordner und nicht im AppDataDir

    EDIT: _CharToOem() ist sehr geil. Jetzt schaut die CommandLine-Ausgabe sehr schön aus.

    EDIT: Ich mache nachher weiter, muss erst mal zu einem Termin. :)
    Nach 15 Minuten weiß ich noch nicht genau was passiert und wie ich die Ausgabe verstehen soll.
    Ich glaube aber, das der gesuchte Index immer noch falsch ist. Ich mache nachher aber weiter und versuche zu verstehen was genau passiert und wie ich die Ausgabe zu verstehen habe.
    Aber jetzt schaut es für mich so aus, als wenn _SearchXY() immer noch kein ß vom ss unterscheiden kann.

  • Meine SciTE\SciTEUser.properties ist komplett leer, wo bekomme ich eine DEFAULT her?

    In der portablen Version SciTE4AutoIt3_Portable.zip findest du eine 'Default-' bzw. 'example-SciTEUser.properties'... die aber so gut wie leer ist.

    # example-SciTEUser.properties
    import au3.keywords.user.abbreviations
    import au3.UserUdfs

    Der Inhalt meiner SciTEUser.properties ist im Laufe der Zeit angewachsen... habe einige Tools installiert, die das Leben mit AutoIt/SciTE enorm erleichtern... die meisten davon stammen von BugFix .

    Hier mal ein Auszug...
    AutoStampSaveVersion, CodeAsHtml, ContinuousComments, EdgingSelection, IncludesHelper, ManageIncludes, Ownhotkeys, SciTEx, SelectStatement, ShowHexColorFromCursor, VarGetTipp

    Sämtliche Einstellungen für selbst eingepflegte Tools und/oder Änderungen an der Konfiguration sollten in der SciTEUser.properties bzw. den *user*.properties gespeichert werden, damit sie nach einem AutoIt-/SciTE-Update erhalten bleiben.

    Das Problem mit den Codepages ergibt sich dadurch, dass Scripte/UDFs aus diversen Quellen teils mit anderen Editoren, auf anderen Betriebssystemen und/oder in anderer Sprache erstellt wurden. Eine patentierbare Lösung gibt es dafür also leider nicht.

    Hier findest du sehr interessante Infos zu diesem Thema: Einführung in Codepages und Unicode

    Ich habe mal meine SciTEUser.properties als Dateianhang hochgeladen, die schon einen recht guten Eindruck davon vermittelt, wie gut die Einstellungen an die eigenen Bedürfnisse angepasst werden können.

  • VIELEN Dank für deine SciTEUser.properties.
    Diese werde ich mir mal anschauen und für mich sinnvolle Bereiche "übernehmen".
    @BugFix, danke für die LUA Scripte

    Da sind ja wirklich schöne Sachen drin. Werde dann mal über die Suchfunktion die einzelnen "Tools"LUA" besorgen.

    Zurück zu meinem Problem:

    Code
    $Array1[4] : c_ausser	$Array2[4] : c_ausser
    BinarySearchIndex: 4 c_ausser
    NormalSearchIndex: 4 c_ausser
    $Array1[5] : c_außer	$Array2[5] : c_außer
    BinarySearchIndex: 4 c_außer
    NormalSearchIndex: 4 c_außer

    Hier wird ja wirklich das falsche zurück gegeben.
    c_ausser ist noch richtig mit Index 4.
    c_außer wird nicht gefunden, sondern dann wieder Index 4.

    Ist das bei dir / bei euch auch so?
    Also ein allgemeines Problem oder nur etwas auf meinen 2 PCs und somit ein lokales Problem bei mir?

  • Ich habe den Fehler GEFUNDEN!

    Es ist ein BUG im UDF von ARRAY.AU3:

    Hier meine GEFIXTE VERSION:

    und zwar in Zeile 25 und 39.
    Zeile 25:
    Original: While $iStart <= $iMid And $vValue <> $Array[$iMid]
    FIX: While $iStart <= $iMid And Not ($vValue == $Array[$iMid])
    Zeile 39:
    Original: While $iStart <= $iMid And $vValue <> $aArray[$iMid][$iColumn])
    FIX: While $iStart <= $iMid And Not ($vValue == $aArray[$iMid][$iColumn])


    Hier meine Ausgabe aus dem 1. Post nun mit richtiger Erkennung ss und ß, also b_außer und b_ausser


    Für mich bleibt nur noch eine Frage:
    Sollte ich das nun auch im englishen Forum posten, sodass der Bugfix geprüft und dann in die neue Version übernommen werden kann?

  • Ich denke mal eher, du hast das Problem nur durch ein anderes Problem ersetzt...

    AutoIt
    While $iStart <= $iMid And $vValue <> $aArray[$iMid]		; Original
    While $iStart <= $iMid And Not ($vValue == $Array[$iMid])	; Fixed ?


    Der Knackpunkt ist doch, dass in _ArrayBinarySearch() mit '<', '>' und '<>' verglichen wird... es ist also eine nicht-sensive Suche - gut, zumal eine sensitive Suche schon deshalb nicht möglich sein darf, weil die AutoIt-Hilfe besagt, dass diese Funktion den Parameter $iCase nicht kennt!

    Wird einer der Vergleichsoperatoren '<', '>' und '<>' durch 'NOT (==)' ersetzt, passiert aber genau dies... es wird sensitiv gesucht - wobei durch das NOT nun nur noch etwas gefunden wird, wenn die Schreibweise NICHT identisch ist!

    Spoiler anzeigen
  • So in etwa... wenn du die Zeichen ersetzten willst... geht sicher auch als Einzeiler... doch dafür bin ich nicht fit genug. ;)

    Nachtrag: Wer ist hier der Böse?
    Bei genauer Betrachtung ist es kein Bug in _ArraySearch und/oder _ArrayBinarySearch - das vermeintliche Problem sind hier die Vergleichsoperatoren <, >, und <>, welche nicht das 'erwartete' Ergebnis liefern.
    Durch dich inspiriert habe ich nun mit ein paar Array-Funktionen gespielt und geschaut, welche ein ß von einem ss unterscheidet - keine gefunden!
    _ArraySearch mit gesetztem Parameter $iCase = 1 sollte allerdings ein -1 als Ergebnis liefern, was aber auch nicht der Fall ist.

    Als Workaround könnte man das Array vor jedem Aufruf z. B. in Hex-Werte konvertieren... dann wäre...
    ß =

    Spoiler anzeigen

    Einmal editiert, zuletzt von Bitnugger (23. Juni 2016 um 08:54)

  • super, habe ich mal übernommen :D

    Jetzt merkt sich mein script, welche Einträge er ersetzt hat.
    Nachdem ich dann viel in meinem Array modifiziert habe, werden die entsprechende Einträge wieder zurück ersetzt, also ein ss zu einem ß.

    Dieser Workaround läuft nun ganz annehmbar