Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PowerShell glaubt, 'i' sei kein ASCII-Zeichen

20 views
Skip to first unread message

Christoph Schneegans

unread,
Dec 10, 2012, 10:09:00 AM12/10/12
to
Hallo allerseits!

Ich m�chte mit einem regul�ren Ausdruck in PowerShell alle Nicht-
ASCII-Zeichen (d.h. die Unicode-Zeichen ab U+0080) in einem
String l�schen.

"aeiou���" -replace '[\u0080-\uffff]', ''

sollte eigentlich die Ausgabe

aeiou

erzeugen, tats�chlich erhalte ich aber

aeou,

d.h. das 'i' wird ebenfalls gel�scht.

Kann vielleicht jemand �berpr�fen, was in PowerShell 3.0 passiert?
Ich habe hier Windows XP und kann deshalb nur mit 2.0 testen.

Ein m.E. �quivalentes VB.NET-Programm mit der Anweisung

Console.Out.WriteLine(Regex.Replace("aeiou���", "[\u0080-\uffff]", ""))

macht es richtig, d.h. es gibt

aeiou

aus.

--
<http://schneegans.de/computer/safer/> � SAFER mit Windows

Stefan Reuther

unread,
Dec 10, 2012, 1:19:05 PM12/10/12
to
Christoph Schneegans wrote:
> Ich möchte mit einem regulären Ausdruck in PowerShell alle Nicht-
> ASCII-Zeichen (d.h. die Unicode-Zeichen ab U+0080) in einem
> String löschen.
>
> "aeiouäöü" -replace '[\u0080-\uffff]', ''
>
> sollte eigentlich die Ausgabe
>
> aeiou
>
> erzeugen, tatsächlich erhalte ich aber
>
> aeou,
>
> d.h. das 'i' wird ebenfalls gelöscht.

Arbeitet das Ding zufälligerweise case-insensitive, und kann man ihm das
abgewöhnen?

'i' hat neben dem Großbuchstaben 'I', den wir alle kennen, auch noch den
Großbuchstaben 'İ' (\u0130).


Stefan

Christoph Schneegans

unread,
Dec 10, 2012, 2:38:50 PM12/10/12
to
Stefan Reuther schrieb:

>> "aeiouäöü" -replace '[\u0080-\uffff]', ''
>>
>> sollte eigentlich die Ausgabe
>>
>> aeiou
>>
>> erzeugen, tatsächlich erhalte ich aber
>>
>> aeou,
>>
>> d.h. das 'i' wird ebenfalls gelöscht.
>
> Arbeitet das Ding zufälligerweise case-insensitive, und kann man
> ihm das abgewöhnen?

In der Tat erhalte ich mit

"aeiouäöü" -creplace '[\u0080-\uffff]', ''

das gewünschte Ergebnis. Danke!

Auch in den .NET-Klassen kann man den Unterschied zwischen

Console.Out.WriteLine(Regex.Replace("aeiouäöü", "[\u0080-\uffff]", "", RegexOptions.IgnoreCase))

einerseits und

Console.Out.WriteLine(Regex.Replace("aeiouäöü", "[\u0080-\uffff]", ""))

bzw.

Console.Out.WriteLine(Regex.Replace("aeiouäöü", "[\u0080-\uffff]", "", RegexOptions.None))

andererseits nachvollziehen.

> 'i' hat neben dem Großbuchstaben 'I', den wir alle kennen, auch
> noch den Großbuchstaben 'İ' (\u0130).

Das wird sicher die Ursache sein, entsprechend liefert

"i" -match "\u0130"

ja auch $True.

--
“Microsoft … has now thrown the old customer base under the bus by
designing an operating system that removes a powerful PC's benefits
in order to work better on smaller devices.”
— Jakob Nielsen, http://www.useit.com/alertbox/windows-8.html

Claus Reibenstein

unread,
Dec 11, 2012, 3:07:41 AM12/11/12
to
Stefan Reuther schrieb:

> 'i' hat neben dem Großbuchstaben 'I', den wir alle kennen, auch noch den
> Großbuchstaben 'İ' (\u0130).

Aber nicht im Deutschen. Außerdem fehlt dann auch noch 'ı' (\u0131) als
Kleinbuchstabe zum 'I'.

Gruß
Claus

Uwe Sieber

unread,
Dec 11, 2012, 3:11:29 AM12/11/12
to
Wow, interessant. Woher weiß man sowas?


Gruß Uwe

Claus Reibenstein

unread,
Dec 11, 2012, 5:56:15 AM12/11/12
to
Uwe Sieber schrieb:

> Stefan Reuther wrote:
>
>> 'i' hat neben dem Großbuchstaben 'I', den wir alle kennen, auch noch den
>> Großbuchstaben 'İ' (\u0130).
>
> Wow, interessant. Woher weiß man sowas?

Von türkischen Freunden/Kollegen/Bekannten/... :-)

Gruß
Claus

Christoph Schneegans

unread,
Dec 11, 2012, 7:20:54 AM12/11/12
to
Christoph "Ingrid" Schneegans schrieb:

> Auch in den .NET-Klassen kann man den Unterschied zwischen
>
> Console.Out.WriteLine(Regex.Replace("aeiouäöü", "[\u0080-\uffff]", "", RegexOptions.IgnoreCase))
>
> einerseits und
>
> Console.Out.WriteLine(Regex.Replace("aeiouäöü", "[\u0080-\uffff]", ""))
>
> bzw.
>
> Console.Out.WriteLine(Regex.Replace("aeiouäöü", "[\u0080-\uffff]", "", RegexOptions.None))
>
> andererseits nachvollziehen.

Die "korrekte" Lösung in .NET dürfte allerdings

Console.Out.WriteLine(Regex.Replace("aeiouäöü", "[\u0080-\uffff]", "", RegexOptions.CultureInvariant))

sein. Für -match in PowerShell kann man diese Option aber offenbar
nicht angeben.

Ich habe diesen Fehler peinlicherweise schon an mehreren Stellen
gemacht, bspw. gibt <http://schneegans.de/lv/?tags=it-%C4%B0T>
aktuell noch ein falsches Ergebnis aus, denn "it-İT" ist natürlich
unzulässig.

--
<http://schneegans.de/computer/safer/> · SAFER mit Windows

Thorsten Albers

unread,
Dec 11, 2012, 12:44:04 PM12/11/12
to
Uwe Sieber <ma...@uwe-sieber.de> schrieb im Beitrag
<aioafb...@mid.individual.net>...
> Wow, interessant. Woher weiß man sowas?

Aus den Daten der Unicode-Org. (www.unicode.org):
"i (...) Turkish and Azerbaijani use 0130 I for uppercase"

--
Thorsten Albers

gudea at gmx.de

Stefan Reuther

unread,
Dec 11, 2012, 1:58:12 PM12/11/12
to
Uwe Sieber wrote:
> Stefan Reuther wrote:
>> 'i' hat neben dem Großbuchstaben 'I', den wir alle kennen, auch noch den
>> Großbuchstaben 'İ' (\u0130).
>
> Wow, interessant. Woher weiß man sowas?

Das sind halt so die Kleinigkeiten, die das Internationalisieren kniff-
lig machen: es kann keine allgemeine "diesen String in Großbuchstaben
konvertieren"-Funktion geben, weil das sprachabhängig ist. Wer etwas
Aufheiterung braucht: <https://bugs.php.net/bug.php?id=18556>

Windows hat die case-insensitivität im Kernel. Der weiß aber nicht, was
für eine Sprache eingestellt ist. Also kann er nicht darauf Rücksicht
nehmen, sondern betrachtet einige Zeichen als gleich, auch wenn die in
Deutsch halt mal keine Pärchen sind.

Zum Probieren: mit Notepad eine Datei "i.txt" anlegen, und dann nochmal
"Speichern unter" als "İ.txt" (zum Eingeben einfach mit Charmap U+0130
in die Zwischenablage befördern) -> Fehlermeldung "gibt's schon".

Stellenweise betrachtet Windows auch andere Zeichen als identisch,
beispielsweise "a" und "Ā" (U+0100).


Stefan

0 new messages