【问题标题】:Manipulating files with non-English names in R在 R 中处理具有非英文名称的文件
【发布时间】:2014-08-12 19:28:40
【问题描述】:

在 Windows 中使用 R 函数操作文件时,例如dir(),那些非英文字符,如西里尔文,以“?”序列表示。

类似地,当使用file.rename() 时,如果新名称包含非英文字符,文件将被重命名为不可读的字符,显然映射到不同的编码。

处理文件内容编码的函数有很多,但是我们如何处理文件名呢?

重现问题:
在 R 之外,在工作目录中创建文件“привет.txt”;然后在 R 中:

dir() 
# [1] "??????.txt"      
# ...

注意设置:

Sys.setlocale(category = "LC_ALL", locale="Russian")

没有帮助。

注意:我使用 R 3.1.2 for Windows、Windows 8.1 英文版和 Windows 控制台 (cmd.exe) 我可以正确看到西里尔字母名称。

【问题讨论】:

    标签: r utf-8 character-encoding internationalization cyrillic


    【解决方案1】:

    试试这个:iconv("привет.txt","UTF-8","CP1251")

    在编码之间转换字符向量:
    https://stat.ethz.ch/R-manual/R-devel/library/base/html/iconv.html

    iconv 库:
    http://www.delorie.com/gnu/docs/recode/recode_30.html

    【讨论】:

    • 它是这样工作的;但是,如果我使用iconv(dir() ,"UTF-8","CP1251"),“привет.txt”将变为"??????.txt"
    【解决方案2】:

    如果您只想运行脚本一两次并了解目标语言,一个简单的解决方案是更改位置。

    Sys.setlocale(category = "LC_ALL", locale="Russian") 
    x1<-read.table("C:\\привет.txt",head=TRUE)  #work just fine with R_3.1.2
    Sys.setlocale(category = "LC_ALL", locale="English") 
    x2<-read.table("C:\\привет.txt",head=TRUE)  #will present error
    

    如果您想从服务器读取,我强烈建议您使用 Python 或其他脚本语言来处理 Unicode 路径。如果你坚持,我会说: (参考Set locale to system default UTF-8

    Sys.setlocale(category = "LC_ALL", locale = "English_United States.1252")
    x3<-read.table("C:\\привет.txt",head=TRUE)  #will present warning or not, but successfully read a table into x3
    

    但是,您仍应使用某些包(例如 stringi)处理此表的内容,并记得在必要时在此读取操作后恢复位置。

    ==更新==

    (c.f.https://stat.ethz.ch/pipermail/r-help/2011-May/278206.html) 根据 R-FAQ 文档,这也可能是一个不一致的问题:

    3.6 我在 R 控制台中看不到带有重音符号的字符,例如在文本中。

    您需要在 Rconsole(参见 Q5.2)中指定支持 使用中的编码。这曾经是早期版本的问题 Windows,但现在很难找到没有的字体。

    Rterm 中对这些字符的支持取决于环境 (终端窗口和外壳,包括语言环境和代码页 设置)在其中运行以及使用的字体 终端窗口。这些通常在旧版 DOS 设置上,需要 改变了。

    请告诉我您是否可以使用“读取”在 R-console 中输入俄语文件名。谢谢。

    【讨论】:

    • 因为我根本不懂俄语,所以我使用@Matt 的示例文件名。 :-)
    • 假设“привет.txt”在工作目录Sys.setlocale(category = "LC_ALL", locale="Russian"); dir(),为“привет.txt”提供“??????.txt”。
    • @antonio 听取您的意见,我再次尝试了 Matt 的方法和我的方法。两者都工作得很好。我也试过中文。我的机器设置是 Win7(64 位)和 R 3.1.2(x64)。我昨天做的是用 StatET 在 Eclipse 中运行脚本。但我现在尝试使用 R-console,它对我来说很好用。为什么不尝试另一台机器并检查您的系统是否正确设置了 Unicode?感谢您的回复。
    • Sys.setlocale("LC_ALL", "Russian_Russia.1252") 试试这个。见:link[link]
    • @Henr.L: привет 的意思是“你好”
    【解决方案3】:

    我没有设法更正 dir() 函数上的显示,但函数 Sys.glob(paths="*") 得到的结果与 dir() 相同,只是它确实以西里尔文显示名称,无论您的区域设置如何。

    例如,如果您的文件在工作目录中,您可以尝试:

    Sys.glob(paths="*")
    

    它应该正确显示为“привет.txt”(对我有用)。 Sys.glob 上的文档:https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/Sys.glob

    同样,要重命名文件,正确的方法似乎是使用与file.rename 不同的函数。以下应将名为“test.doc”的文件重命名为“привет.txt”(适用于我)

    fs::file_move("test.doc", "привет.txt")
    

    fs 包允许使用更接近 cmd 函数的函数来操作文件。文档:https://cran.r-project.org/web/packages/fs/vignettes/function-comparisons.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-27
      • 2011-06-09
      • 2012-08-19
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      相关资源
      最近更新 更多