我只是在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(LATIN SMALL LETTER A WITH DIAERESIS).
“Ka< cc>< 88> se”将“ä”编码为unicode字符U 0061(LATIN SMALL LETTER A)和U 0308(COMBINING DIAERESIS).
两者在技术上都是正确的,但不同.要比较它们,您需要规范化字符串.您可以使用包stringi:
stri_trans_nfc("Ka\u0308se") -> "K\u00E4se"
更多信息:
> Unicode normalization (form C) in R : convert all characters with accents into their one-unicode-character form?
> Wikipedia: Unicode Equivalence