我正在尝试使用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,这显然不在指定的范围内。
答案 0 :(得分:1)
原因是i
匹配U+0130
("拉丁大写字母I上面有点"),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"
}
}
答案 1 :(得分:0)
区分大小写是此奇怪的土耳其语İ
错误的另一个解决方法。顶部有一个小点。
"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
似乎也有问题。小写字母是常规的小“ k”。忽略大小写时将其视为ascii。我不确定为什么它的行为与土耳其语İ
不同。
[char]0x212a | select-string '\P{IsBasicLatin}' # no output