【问题标题】:resolving OS vs list.files() handling of accented characters解决 OS vs list.files() 处理重音字符
【发布时间】: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 a1Encoding(...) 为两个字符串显示 UTF-8

标签: r locale filenames


【解决方案1】:

我在 Mac 上和你一样。尝试给出“test\u00e1”的模式,这就是我的as.hexmode(utf8ToInt("á")) 所说的 ASCII 值:

最终建议使用蛮力解决手头的问题。

> file.rename("testá", "testXXX")
[1] TRUE
> list.files(pattern="testXXX")
[1] "testXXX"

和 R Yoda 一样,我首先查看了 charToRaw 并收到了错误的翻译,我得到了这个:

> "\u00e1"
[1] "á"
> "test\uc3a1"
[1] "test쎡"

【讨论】:

    【解决方案2】:

    感谢@42- 和@RYoda 提供的线索:因为我的底层文件系统是HFS+,所以我能够找到这个blog post on "HFS+ and utf8 accented characters",这导致我找到了this SO question & answer on Unicode normalization,这导致了解决方案

    list.files(pattern=stringi::stri_trans_nfd("testá"))
    

    ?stri_trans_nfd 让我们知道“nfd”代表

    • NFD(规范分解),

    【讨论】:

      猜你喜欢
      • 2012-01-04
      • 2019-11-05
      • 1970-01-01
      • 2023-04-01
      • 2011-11-29
      • 2020-06-29
      • 2011-03-08
      • 2021-01-28
      • 1970-01-01
      相关资源
      最近更新 更多