Mon*_*ift 5 r character-encoding dataframe
我很困惑为什么某些字符(例如“?”、“?”和“?”)在数据框中丢失了它们的变音符号,而其他字符(例如“Š”和“š”)不会。顺便说一下,我的操作系统是 Windows 10。在我下面的示例代码中,向量 czechvec 有 11 个单字符字符串,都是斯拉夫语重音字符。R 正确显示这些字符。然后使用 czechvec 作为第二列创建数据框 mydf (使用函数 I() 因此它不会转换为因子)。但是,当 R 显示 mydf 或 mydf 的任何行时,它会将这些字符中的大部分转换为它们的纯 ASCII 等价物;例如 mydf[3,] 将字符显示为“E”而不是“?”。但是用行和列下标,例如 mydf[3,2],它正确地显示了重音字符(“?”)。为什么 R 显示整行或仅显示一个单元格会有所不同?为什么像“Š”这样的一些字符完全不受影响?此外,当我将此数据框写入文件时,即使我指定了 fileEncoding="UTF-8",它也会完全失去重音。
> charvals <- c(193, 269, 282, 268, 262, 263, 348, 349, 350, 352, 353)
> hexvals <- as.hexmode(charvals)
> czechvec <- unlist(strsplit(intToUtf8(charvals), ""))
> czechvec
[1] "Á" "?" "?" "?" "?" "?" "?" "?" "?" "Š" "š"
>
> mydf = data.frame(dec=charvals, char=I(czechvec), hex=I(format(hexvals, width=4, upper.case=TRUE)))
> mydf
dec char hex
1 193 Á 00C1
2 269 c 010D
3 282 E 011A
4 268 C 010C
5 262 C 0106
6 263 c 0107
7 348 S 015C
8 349 s 015D
9 350 S 015E
10 352 Š 0160
11 353 š 0161
> mydf[3,2]
[1] "?"
> mydf[3,]
dec char hex
3 282 E 011A
>
> write.table(mydf, file="myfile.txt", fileEncoding="UTF-8")
>
> df2 <- read.table("myfile.txt", stringsAsFactors=FALSE, fileEncoding="UTF-8")
> df2[3,2]
[1] "E"
Run Code Online (Sandbox Code Playgroud)
编辑添加:根据 Ernest A 的回答,此行为在 Linux 中不可重现。应该是windows问题。(我在 Windows 上使用 R 3.4.1。)
我无法使用 R 版本 3.3.3 (Linux) 重现此行为。
\n\n> data.frame(dec=charvals, char=I(czechvec), hex=I(format(hexvals, width=4, upper.case=TRUE)))\n dec char hex\n1 193 \xc3\x81 00C1\n2 269 \xc4\x8d 010D\n3 282 \xc4\x9a 011A\n4 268 \xc4\x8c 010C\n5 262 \xc4\x86 0106\n6 263 \xc4\x87 0107\n7 348 \xc5\x9c 015C\n8 349 \xc5\x9d 015D\n9 350 \xc5\x9e 015E\n10 352 \xc5\xa0 0160\n11 353 \xc5\xa1 0161\nRun Code Online (Sandbox Code Playgroud)\n