regexp: unicode als zeichenklasse
seth
- javascript
0 seth0 Gunnar Bittersmann0 seth
0 Gunnar Bittersmann
gudn tach!
erwartet haette ich jedes mal einen unveraenderten string also "aia"/"aIa".
alert("aia".replace(/\u0130+/i, "X")); // prints "aia"
alert("aIa".replace(/\u0130+/i, "X")); // prints "aIa"
alert("aia".replace(/[\u0130]+/i, "X")); // prints "aXa" ???
alert("aIa".replace(/[\u0130]+/i, "X")); // prints "aIa"
ich verstehe nicht, warum im dritten beispiel eine ersetzung stattfindet. warum ist das so?
prost
seth
gudn tach!
alert("aia".replace(/\u0130+/i, "X")); // prints "aia"
alert("aIa".replace(/\u0130+/i, "X")); // prints "aIa"
alert("aia".replace(/[\u0130]+/i, "X")); // prints "aXa" ???
alert("aIa".replace(/[\u0130]+/i, "X")); // prints "aIa"
> ich verstehe nicht, warum im dritten beispiel eine ersetzung stattfindet. warum ist das so?
/u0130 ist ein besonderes I. warum bei ausgerechnet diesem eine ausnahme gemacht wird, bleibt mir schleierhaft, aber man muss es wohl in javascript (nicht jedoch beispielsweise in perl oder php) so hinnehmen.
siehe auch <http://regexadvice.com/blogs/mash/default.aspx?p=2>
prost
seth
Moin Moin!
gudn tach!
alert("aia".replace(/\u0130+/i, "X")); // prints "aia"
alert("aIa".replace(/\u0130+/i, "X")); // prints "aIa"
alert("aia".replace(/[\u0130]+/i, "X")); // prints "aXa" ???
alert("aIa".replace(/[\u0130]+/i, "X")); // prints "aIa"
> > ich verstehe nicht, warum im dritten beispiel eine ersetzung stattfindet. warum ist das so?
>
> /u0130 ist ein besonderes I.
Ja, "LATIN CAPITAL LETTER I WITH DOT ABOVE", z.B. aus dem Türkischen.
> warum bei ausgerechnet diesem eine ausnahme gemacht wird, bleibt mir schleierhaft,
Es gibt im türkischen zwei "i"s, eines mit, eines ohne Punkt. Während im Deutschen der Punkt nur beim kleinen "i" vorkommt und das große "I" ohne Punkt dessen Equivalent ist, bleibt im Türkischen der Punkt / Nicht-Punkt bei der Umwandlung in Groß- bzw. Kleinbuchstaben erhalten.
Siehe z.B. <http://www.codinghorror.com/blog/archives/001075.html>
> aber man muss es wohl in javascript (nicht jedoch beispielsweise in perl oder php) so hinnehmen.
In Javascript wird dieses Problem standardmäßig berücksichtigt, Perl muß man erst dazu überreden (per [locale](http://search.cpan.org/perldoc?perllocale) und Behandlung von Strings als Unicode), weil Perl traditionell mit Bytes statt mit Unicode-Zeichen arbeitet.
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
gudn tach!
warum bei ausgerechnet diesem eine ausnahme gemacht wird, bleibt mir schleierhaft,
Es gibt im türkischen zwei "i"s, eines mit, eines ohne Punkt. Während im Deutschen der Punkt nur beim kleinen "i" vorkommt und das große "I" ohne Punkt dessen Equivalent ist, bleibt im Türkischen der Punkt / Nicht-Punkt bei der Umwandlung in Groß- bzw. Kleinbuchstaben erhalten.
ja, interessant finde ich, dass dies wohl die einzige ausnahme ist bei den zeichen aus [a-z], und das obwohl's doch so viele verschiedende sprachen/schriften gibt.
Siehe z.B. http://www.codinghorror.com/blog/archives/001075.html
hehe, cool, <schwarzmal>demnaechst muessen also alle scripts immer sukzessive in allen locales durchprobiert werden, yippieh!</schwarzmal>
aber man muss es wohl in javascript (nicht jedoch beispielsweise in perl oder php) so hinnehmen.
In Javascript wird dieses Problem standardmäßig berücksichtigt, Perl muß man erst dazu überreden (per locale und Behandlung von Strings als Unicode), weil Perl traditionell mit Bytes statt mit Unicode-Zeichen arbeitet.
hmm, aber ich dachte, dass unicode und locale sich normalerweise nicht beissen... perldoc perlunicode.
prost
seth
@@seth:
nuqneH
/u0130 ist ein besonderes I.
Türken und Sprecher von anderen Turksprachen mit lateinischer Schrift werden in İ nichts Besonderes sehen.
Überhaubt sollte man von dem Begriff „Sonderzeichen“ für Nicht-ASCII-Zeichen mal wegkommen, wir leben nicht mehr im Jahre 1970. In HTML gibt es genau 5 Sonderzeichen: < > & ' ". Alle anderen Zeichen (und damit sind nicht nur lateinische Buchstaben gemeint) sind nicht besonderer als A.* Es gibt allenfalls unfähige Software, die mit Unicode nicht klarkommt.
Qapla'
* Ich weiß, dass es den Komparativ nicht gibt.
gudn tach!
/u0130 ist ein besonderes I.
Türken und Sprecher von anderen Turksprachen mit lateinischer Schrift werden in İ nichts Besonderes sehen.
es ist ein besonderes "i", so wie ein "ß" ein besonderes "s" und ein "å" ein besonderes "a" ist. es ist allerdings besonders besonders, da es offenbar das einzige utf8-zeichen ist, das als eine version eines zeichens aus [a-z] angesehen wird.
Überhaubt sollte man von dem Begriff „Sonderzeichen“ für Nicht-ASCII-Zeichen mal wegkommen, wir leben nicht mehr im Jahre 1970.
ein sonderzeichen ist fuer mich auch z.b. ein "!", das im ascii vorkommt.
In HTML gibt es genau 5 Sonderzeichen: < > & ' ". Alle anderen Zeichen (und damit sind nicht nur lateinische Buchstaben gemeint) sind nicht besonderer als A.* Es gibt allenfalls unfähige Software, die mit Unicode nicht klarkommt.
in unicode sind auch nicht alle zeichen enthalten, somit ist wohl jegliche software unfaehig, da z.b. dieser buchstabe (sorry, ich kann ich nicht schreiben) von ihr nicht dargestellt werden kann, da er auch gar nicht im unicode enthalten ist.
natuerlich kann man sich ueber den stand der technik hinwegsetzen und den status quo schon mal vorsorglich als obsolet deklarieren. aber pragmatisch ist das nicht gerade. zumindest hilft es nicht in der sache. solange die zeichen ausserhalb des ascii besonderes handling benoetigen, ist eine unterscheidung zw. ascii und unicode notwendig. das ist tautologisch und hat nichts mit 1970 zu tun.
prost
seth
@@seth:
nuqneH
es ist ein besonderes "i", so wie ein "ß" ein besonderes "s"
'I'/'ı' und 'İ'/'i' sind verschieden Buchstaben des türkischen Alphabets, 'ß' ist kein 's'.
es ist allerdings besonders besonders, da es offenbar das einzige utf8-zeichen ist, das als eine version eines zeichens aus [a-z] angesehen wird.
Die Besonderheit mag daher rühren, dass 'I' in Nicht-Turksprachen der Großbuchstabe von 'i' ist, in Turksprachen aber von 'ı'. Und daher, dass 'i' in Nicht-Turksprachen der Kleinbuchstabe von 'I' ist, in Turksprachen aber von 'İ'.
ein sonderzeichen ist fuer mich auch z.b. ein "!", das im ascii vorkommt.
'!' ist ein Satzzeichen (Interpunktionszeichen), daran ist nichts besonderes. Oder schreibst du ohne Punkt und Komma?
(Großbichstaben scheinen für dich Sonderzeichen zu sein? ;-))
solange die zeichen ausserhalb des ascii besonderes handling benoetigen
Das sollten sie nicht; Software sollte soweit internationalisiert sein. Ist sie das nicht, ist sie diesbezüglich auf dem Stand von 1970, nicht von 2009.
Qapla'
gudn tach!
es ist ein besonderes "i", so wie ein "ß" ein besonderes "s"
'I'/'ı' und 'İ'/'i' sind verschieden Buchstaben des türkischen Alphabets, 'ß' ist kein 's'.
doch, aber von mir aus kein besonderes, sondern ein besonders scharfes... ;-p
es ist allerdings besonders besonders, da es offenbar das einzige utf8-zeichen ist, das als eine version eines zeichens aus [a-z] angesehen wird.
Die Besonderheit mag daher rühren, dass 'I' in Nicht-Turksprachen der Großbuchstabe von 'i' ist, in Turksprachen aber von 'ı'. Und daher, dass 'i' in Nicht-Turksprachen der Kleinbuchstabe von 'I' ist, in Turksprachen aber von 'İ'.
eben.
ein sonderzeichen ist fuer mich auch z.b. ein "!", das im ascii vorkommt.
'!' ist ein Satzzeichen (Interpunktionszeichen), daran ist nichts besonderes. Oder schreibst du ohne Punkt und Komma?
brockhaus:
Sonderzeichen, Computertechnik, Informatik: alle Zeichen, die nicht Buchstaben oder Ziffern sind, z. B. +, §.
duden duw:
Son|der|zei|chen, das (Druckw., EDV): Zeichen, das weder Buchstabe noch Ziffer ist.
in der wikipedia kann jeder, der moechte, selbst nachschlagen.
(Großbichstaben scheinen für dich Sonderzeichen zu sein? ;-))
nee, aber umlaute und das eszett, weil ich dafuer immer mein keyboard-layout umstellen, ascii-codes eingeben oder verrenkungen machen muss.
prost
seth
Moin Moin!
es ist ein besonderes "i", so wie ein "ß" ein besonderes "s"
'I'/'ı' und 'İ'/'i' sind verschieden Buchstaben des türkischen Alphabets, 'ß' ist kein 's'.
doch, aber von mir aus kein besonderes, sondern ein besonders scharfes... ;-p
Nö, ß ist eine Ligatur aus ſ und z bzw. ſ und s, und bis vor kurzem der einzige Buchstabe im Deutschen, für den es keinen Großbuchstaben gab, aber stattdessen zwei Ersatzschreibweisen. Dinge, die Unicode kompliziert machen: Wann mutiert ein ß in der Uppercase-Funktion zu SZ, wann zu SS?
Alexander
Dinge, die Unicode kompliziert machen: Wann mutiert ein ß in der Uppercase-Funktion zu SZ, wann zu SS?
Jetzt musste ich extra nachgucken. Niemals zu „SZ“. „SS“ ist immer die definierte Uppercase-Funktion von „ß“. „Ss“ ist für den Titlecase-Fall definiert, der nur dann Eintritt, wenn das „ß“ am Anfang eines Wortes steht – was nicht passiert. „ẞ“ ist niemals Ziel. Wo könntest Du meinen, dass ein „SZ“ herkommt?
Moin Moin!
Wo könntest Du meinen, dass ein „SZ“ herkommt?
Aus dem alten Duden mit dem Klassiker MASZE vs. MASSE.
Alexander
Hi,
Wo könntest Du meinen, dass ein „SZ“ herkommt?
Aus dem Süddeutschen Verlag - Abteilung Zeitungsdruck ;-)
cu,
Andreas
@@seth:
nuqneH
ich verstehe nicht, warum im dritten beispiel eine ersetzung stattfindet. warum ist das so?
… im Firefox?
IE 6 und 7 geben 4× "aXa" aus.
Eigenartiges Verhalten des Fuchses, in der Tat. Man sollte doch zumindest erwarten, dass sich
entwerder alert("aia".replace(/[\u0130]+/i, "X")); // prints "aXa" ???
und alert("aia".replace(/\u0130+/i, "X")); // prints "aia"
oder alert("aia".replace(/[\u0130]+/i, "X")); // prints "aXa" ???
und alert("aIa".replace(/[\u0130]+/i, "X")); // prints "aIa"
gleich verhalten.
Qapla'
gudn tach!
ich verstehe nicht, warum im dritten beispiel eine ersetzung stattfindet. warum ist das so?
… im Firefox?
yup.
prost
seth
@@seth:
nuqneH
ich verstehe nicht, warum im dritten beispiel eine ersetzung stattfindet. warum ist das so?
Die Frage ist: Warum ist das bei den anderen dreien im Firefox nicht so?
Ersetze im Quelltext das Escape '\u0130
' durch das richtige Zeichen 'İ', dann gibt auch Firefox 4× "aXa" aus.
Qapla'