Windows 上的 R : character encoding hell

标签 r csv encoding utf-8 non-ascii-characters

我正在尝试将编码为 OEM-866(西里尔字符集)的 CSV 导入 Windows 上的 R。我还有一个已转换为 UTF-8 w/o BOM 的副本。一旦指定了编码,我系统上的所有其他应用程序都可以读取这两个文件。

此外,在 Linux 上,R 可以使用指定的编码读取这些特定文件。如果我没有指定“fileEncoding”参数,我也可以在 Windows 上读取 CSV,但这会导致文本不可读。当我在 Windows 上指定文件编码时,对于 OEM 和 Unicode 文件,我总是收到以下错误:

原始 OEM 文件导入:

> oem.csv <- read.table("~/csv1.csv", sep=";", dec=",", quote="",fileEncoding="cp866")   #result:  failure to import all rows
Warning messages:
1: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  invalid input found on input connection '~/Revolution/RProject1/csv1.csv'
2: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  number of items read is not a multiple of the number of columns

UTF-8 无 BOM 文件导入:
> unicode.csv <- read.table("~/csv1a.csv", sep=";", dec=",", quote="",fileEncoding="UTF-8") #result:    failure to import all row
Warning messages:
1: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  invalid input found on input connection '~/Revolution/RProject1/csv1a.csv'
2: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  number of items read is not a multiple of the number of columns

语言环境信息:
> Sys.getlocale()
   [1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"

对此负责的 Windows 上的 R 是什么?到目前为止,除了放弃 window 之外,我几乎已经尝试了所有我能做的事情。

谢谢你

(其他失败的尝试):
>Sys.setlocale("LC_ALL", "en_US.UTF-8") #OS reports request to set locale to "en_US.UTF-8" cannot be honored
>options(encoding="UTF-8") #now nothing can be imported  
> noarg.unicode.csv <- read.table("~/Revolution/RProject1/csv1a.csv", sep=";", dec=",", quote="")   #result: mangled cyrillic
> encarg.unicode.csv <- read.table("~/Revolution/RProject1/csv1a.csv", sep=";", dec=",", quote="",encoding="UTF-8") #result: mangled cyrillic

最佳答案

您的问题可能通过将 fileEncoding 更改为 encoding 来解决,这些参数在 read 函数中的工作方式不同(请参阅?read)。

oem.csv <- read.table("~/csv1.csv", sep=";", dec=",", quote="",encoding="cp866")

但是,以防万一,提供更完整的答案,因为可能存在一些不明显的障碍。简而言之:可以在 Windows 上的 R 中使用 Cyrillic(在我的情况下是 Win 7)。

您可能需要尝试一些可能的编码才能使工作正常进行。对于文本挖掘,一个重要的方面是让您的输入变量与数据匹配。 Encoding() 的功能非常有用,参见 iconv()。因此,可以看到您的 native 参数。
Encoding(variant <- "Минемум")

在我的情况下,编码是 UTF-8,尽管这可能取决于系统设置。所以,我们可以用 UTF-8 和 UTF-8-BOM 测试结果,并在 notepad++ 中制作一个测试文件,其中一行拉丁文和一行西里尔文。

UTF8_nobom_cyrillic.csv 和 UTF8_bom_cyrillic.csv
part2, part3, part4
Минемум конкыптам, тхэопхражтуз, ед про

这可以通过以下方式导入到 R 中
raw_table1 <- read.csv("UTF8_nobom_cyrillic.csv", header = FALSE, sep = ",", quote = "\"", dec = ".", fill = TRUE, comment.char = "", encoding = "UTF-8")
raw_table2 <- read.csv("UTF8_bom_cyrillic.csv", header = FALSE, sep = ",", quote = "\"", dec = ".", fill = TRUE, comment.char = "", encoding = "UTF-8-BOM")

这些结果对我来说是 View (raw_table1)中的 BOM 常规西里尔文和控制台中的乱码。
part2, part3, part4
ŠŠøŠ½ŠµŠ¼ŃŠ¼ ŠŗŠ¾Š½ŠŗŃ‹ŠæŃ‚Š°Š¼ тхѨŠ¾ŠæŃ…Ń€Š°Š¶Ń‚ŃŠ

然而,更重要的是,脚本并没有提供对它的访问权限。
> grep("Минемум", as.character(raw_table2[2,1]))
integer(0)

No BOM UTF-8 的结果对于 View (raw_table1)和控制台都是类似的。
part2, part3, part4
<U+041C><U+0438><U+043D><U+0435><U+043C><U+0443><U+043C> <U+043A><U+043E><U+043D><U+043A><U+044B><U+043F><U+0442><U+0430><U+043C> <U+0442><U+0445><U+044D><U+043E><U+043F><U+0445><U+0440><U+0430><U+0436><U+0442><U+0443><U+0437> <U+0435><U+0434> <U+043F><U+0440><U+043E>

然而,重要的是,搜索里面的词会产生正确的结果。
> grep("Минемум", as.character(raw_table1[2,1]))
1

因此,可以在 Windows 中使用非标准字符,具体取决于您的确切目标。
我经常使用非英语拉丁字符,UTF-8 允许在 Windows 7 中正常工作。 “WINDOWS-1252”对于导出到 Microsoft 阅读器(如 Excel)非常有用。

PS 俄语词是在这里生成的http://generator.lorem-ipsum.info/_russian ,所以本质上没有意义。
PPS 你提到的警告仍然没有明显的重要影响。

关于Windows 上的 R : character encoding hell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18789330/

相关文章:

r - 从文件夹中存在的多个 .csv 文件中导入 R 中选定的 .csv 文件

r - 如何将 "reactive"数据作为参数传递给 R Markdown?

csv - 无法使用 tf.compat.v1.keras.utils.get_file 在 Colab 中加载 CSV 文件

c - 将 CSV 文件中的数据添加到结构中

java - 如何在 oracle 列中查找无效的 UTF-8 字符

r - 如何从 n x 3 数据集绘制非凸曲面

excel - 将 Excel 电子表格导入 phpMyAdmin

linux - 在 Vim 终端 lightline 状态栏中显示 ► 字符

php - php 中 JavaScript 的转义括号

regex - R中data.table中一列的子字符串字符