【发布时间】:2018-05-06 21:22:39
【问题描述】:
我正在纠正学生的一些作业,他们的名字中有重音字符(不是我的家乡),并且愚蠢地决定在使用我的 cmets 创建文件时尊重他们名字的实际拼写 (Firstname.Lastname)。一般来说,我创建了文件名(在控制台中或在 Emacs 中使用 Compose 键(例如 compose-'-a 生成á)。这导致了操作系统和 R 的 list.files() 之间的以下不匹配:
system("touch testá") ## create file with accented character in name
list.files(pattern="test") ## it's there ...
## [1] "testá"
但是当我尝试匹配 pattern 参数中的整个单词时...
list.files(pattern="testá")
## character(0)
这是在 Xubuntu 16.04 上,但它是一个虚拟机,所以底层文件系统是 HFS。我的正常语言环境是
[1] "LC_CTYPE=en_CA.UTF8;LC_NUMERIC=C;LC_TIME=en_CA.UTF8;LC_COLLATE=en_CA.UTF8;LC_MONETARY=en_CA.UTF8;LC_MESSAGES=en_CA.UTF8;LC_PAPER=en_CA.UTF8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_CA.UTF8;LC_IDENTIFICATION=C"
但通过Sys.setlocale("LC_ALL","pl_PL.UTF8")(显然成功)切换它并没有帮助。
(对我来说)真正奇怪的是,用“testł”做同样的练习确实工作......
按照 cmets 中的建议,我对 charToRaw 进行了更多探索。实际上,R 中的字符串表示形式和存储在磁盘上的名称是有区别的:
charToRaw("testá")
## [1] 74 65 73 74 c3 a1
charToRaw(list.files(pattern="test"))
## [1] 74 65 73 74 61 cc 81
【问题讨论】:
-
我在 Ubuntu 14.04 上试过这个,我可以匹配整个单词。您的示例中字符串的字节序列是否相同?我的是:
> charToRaw("touch testá") [1] 74 6f 75 63 68 20 74 65 73 74 c3 a1 > charToRaw("testá") [1] 74 65 73 74 c3 a1。Encoding(...)为两个字符串显示UTF-8