JavaScript Split funktioniert nicht bei Russisch?
Ich bin gerade dabei einen Sprachenerkenner zu programmieren und mir ist aufgefallen das bei dem Split von zum Beispiel russischen Buchstaben ein Fehler auftritt. Vor dem Split = а́а́ nach dem Split ['а', '́ ', 'а', '́ ']. Was kann ich tun?
2 Antworten
Ja, ist leider n Problem in js, es gibt dafür wohl eine library names grapheme splitter oder so ähnlich oder du nutzt new Intl.Segmenter() was genau das macht was du suchst, allerdings ist das wiederum in Firefox nicht supported.
Grapheme wird denk ich auch das Keyword sein nach dem du suchst, danach musst du splitten wenn du so was haben möchtest.
Text ist leider nicht immer so Simpel wie man denkt, manche emojis bestehen technisch gesehen z.B. auch aus mehreren einzelnen emojis die mit unsichtbaren Zeichen zusammengefügt werden. Z.B. 🏳️🌈 besteht aus 🏳️🏳️🌈 (und wird so auch angezeigt sollte deine Platform das 🏳️🌈 nicht supporten). Bei á ist das natürlich etwas anders, aber ich denke so was veranschaulicht gut, dass Text splitten komplizierter ist bzw. sein kann als es aussieht.
Über die erwähnte Lib und das Intl.Segmenter Objekt würde es ja funktionieren - brauchst halt entweder ne externe lib oder musst eben damit leben, keinen FF support zu haben.
Für die meisten Sprachen gibt es für diesen Zweck eben Libraries. PHP würde ich generell nicht nehmen, aber das ist ne persönliche Einstellung.
Zu PHP: count() ist da auch falsch. Nutze strlen bzw besser noch mb_strlen und zum Teilen z.B. mb_split
Poste doch mal den verwendeten String und Code dazu, dann können wir uns das ja mal genauer anschauen
euch ist beiden klar, dass ich in der Antwort eine Lib genannt habe die das löst oder? https://github.com/orling/grapheme-splitter
Warum ihr da mit PHP rum machen wollt ist absolut unverständlich, das behavior habt ihr bei den meisten modernen Programmiersprachen, das ist alles völlig normal.
Puh.
Siehe die Warning hier:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split
Warning: When the empty string (
""
) is used as a separator, the string is not split by user-perceived characters (grapheme clusters) or unicode characters (codepoints), but by UTF-16 codeunits. This destroys surrogate pairs. See "How do you get a string to a character array in JavaScript?" on StackOverflow.
Entsprechend musst du anders vorgehen, wenn du die surrogate pairs erhalten möchtest:
ich bekomm es leider nicht hin ein kleines Beispiel würde sehr helfen.
Hm, stimmt, geht bei mir auch nicht. So ein Mist.
ich schaue da gleich noch einmal genauer nach.
Ah okay, das
́
gehört nicht zum eigentlichem Character, sondern ist ein extra Zeichen, deshalb wird das auch extra ausgegeben.
ja aber wie umgehe ich das? Das der aus а́ nicht 'а', '́ ' macht?
Ich bin dabei einen Sprachenerkenner zu programmieren. Ich gebe mehrere Texte mit der dazugehörigen Sprache zum Lernen ein und danach einen Text der analysiert werden soll. Das hat auch mit deutsch und englisch alles geklappt nur jetzt halt mit diesen besonderen Zeichen wie zum Beispiel "а́" bei russisch funktioniert es nicht mehr wegen dem Splitting der besonderen Zeichen.
Dann solltest du deinen Spracherkenner so umschreiben dass er auch mit Zeichen klarkommt, die mit mehr als einem Zeichen codiert werden. Kommt in anderen Sprachen noch häufiger vor als im russischem.
Ich habe jetzt versucht es in PHP u lösen aber da funktioniert selbst der Count also die Anzahl der Länge des Strings nicht da ist zum Beispiel count("а́а́а́") = 12.