我只是对 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"
将“ä”编码为 unicode 字符 U+00E4(带有分音符号的拉丁文小写字母 A)。
"Ka<cc><88>se"
将“ä”编码为 unicode 字符 U+0061(拉丁文小写字母 A)和 U+0308(组合分音符)。
两者在技术上都是正确的,但又截然不同。要比较它们,您需要对字符串进行标准化。您可以使用包 stringi :
stri_trans_nfc("Ka\u0308se") -> "K\u00E4se"
更多信息:
关于regex - R 正则表达式中的变音匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33561962/