разрешение ОС против list.files () обработки акцентированных символов - PullRequest
0 голосов
/ 07 мая 2018

Я исправляю некоторые домашние задания от студентов, у которых в именах есть акцентированные символы (не мой родной язык), и по глупости решил соблюдать фактическое написание их имен при создании файлов с моими комментариями (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ł» работает ...

Как предлагается в комментариях, я немного больше изучил с charToRaw. Фактически существует разница между строковым представлением в R и именем, хранящимся на диске:

charToRaw("testá")
## [1] 74 65 73 74 c3 a1
charToRaw(list.files(pattern="test"))
## [1] 74 65 73 74 61 cc 81

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Благодаря подсказкам от @ 42- и @RYoda: поскольку моя базовая файловая система - HFS +, я смог найти этот пост в блоге «HFS + и utf8 символы с акцентами» , которые привели меня к это ТАК вопрос и ответ по нормализации Unicode , что приводит к решению

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

где ?stri_trans_nfd дает нам знать, что "nfd" означает

• NFD (каноническое разложение),

0 голосов
/ 07 мая 2018

Я на 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쎡"
...