匹配高位 ASCII 字符(但不包括字母 i)

Match high ASCII characters (but not the letter i)

我正在尝试使用 powershell 匹配所有高位 ASCII 和特殊 utf-8 字符:

gc $file -readcount 0 | select-string -allmatches -pattern "[\x80-\uffff]"

应该可以找到我想要的所有字符。但是,正则表达式似乎失败了,因为它匹配字符 "i""I".

我运行这个要测试,我很困惑:

"abcdefghijklmnopqrstuvwxyz" | select-string -allmatches -pattern "[\x80-\uffff]"

为什么匹配"i"?我也没有得到的是,如果您将字符转换为 int,则值为 105,这显然不在指定的 运行ge 范围内。

原因是 iU+0130 上匹配 (İ, "Latin Capital Letter I with dot above"), a variant of capital I found in Turkish:

PS C:\> 'i' -match '[\u0130]'
True

尝试反转模式:

"abcdefghijklmnopqrstuvwxyz" | Select-String -AllMatches -Pattern "[^\x00-\x79]"

以下是我的发现:

0x80..0xffff |ForEach-Object {
    $CharCode = $_.ToString("X4")
    if('i' -match "[\u$CharCode]"){
        "U+$CharCode matches"
    }
}

区分大小写是解决这个奇怪的土耳其 İ 错误的另一种方法。上面有个小点。

"abcdefghijklmnopqrstuvwxyz" | 
  select-string -allmatches -pattern "[\x80-\uffff]" -casesensitive

或者这个,但是字母 i(小写或大写)会在不区分大小写的情况下通过:

# not 0-127
"abcdefghijklmnopqrstuvwxyz" | 
  select-string -allmatches -pattern "\P{IsBasicLatin}" -casesensitive

那个外来字符的小写被认为是英文小写字母i。但它并没有以另一种方式映射(在我们的文化中)。

'İ'.tolower()     
i

'i'.toupper()
I

开尔文 似乎也有问题。它的小写字母是一个普通的小 'k'。当忽略大小写时,它被视为ascii。我不确定为什么它的行为与土耳其语不同İ

[char]0x212a | select-string '\P{IsBasicLatin}' # no output