R正则表达式中的元音匹配

Umlaut matching in R regex

我只是觉得 R 很痛(在 OS X 上)。

我有一组以德语命名的文件。并有我做这个例子的奇怪行为(第一个 'Käse' 是从键盘输入的 - 第二个是从 ls.files() 输出复制的):

names <- c('Käse', 'Käse')
grepl('Käse', names)

# [1] TRUE FALSE

经过大量的大脑抨击后,我注意到控制台中变音符号的显示略有不同。

最后我发现:

iconv(names,'latin1','ascii','bytes')

# [1] "K<c3><a4>se"  "Ka<cc><88>se"

这特别令人惊讶,因为字母 ä 是代码为 132 的 ASCII 字符的一部分。

我还注意到,当我输入(从键盘输入)时

system('touch käse2')

自动转换为第二种编码

所以我的问题是 - 如何配置 R,使我在正则表达式中键入的变音符号与文件名中使用的变音符号相匹配?

Sys.getlocale的输出:

> Sys.getlocale()
[1] "de_AT.UTF-8/de_AT.UTF-8/de_AT.UTF-8/C/de_AT.UTF-8/de_AT.UTF-8"

更新

最让我困扰的行为如下:

filename <- 'Käse.Rdata'
save(file=filename)
list.files(pattern=filename)
# character(0)

所以文件名不等于用于创建它的字符串。

嗯 - 这似乎 Mac 具体 - 在我的 windows 机器上它按预期工作。

"K<c3><a4>se" 将“ä”编码为 un​​icode 字符 U+00E4(带有分音符的拉丁文小写字母 A)。

"Ka<cc><88>se" 将“ä”编码为 un​​icode 字符 U+0061(拉丁文小写字母 A)和 U+0308(组合分音符)。

两者在技术上都是正确的,但又截然不同。要比较它们,您需要规范化字符串。您可以使用包 stringi:

stri_trans_nfc("Ka\u0308se") -> "K\u00E4se"

更多信息: