写入数据不保留编码

qua*_*qua 12 encoding r character-encoding

我有一个像下面这样的字符串:

str <- "????????"
Encoding(str) #returns "UTF-8"
Run Code Online (Sandbox Code Playgroud)

我把它写到磁盘:

write.table(str, file="chartest", quote=F, col.names=F, row.names=F)
Run Code Online (Sandbox Code Playgroud)

现在我看一下Notepadd ++中的文件,它设置为UTF-8而没有BOM编码,我得到了这个:

<U+3066><U+3044><U+305F><U+3060><U+3051><U+308B><U+306A><U+3089>
Run Code Online (Sandbox Code Playgroud)

这个过程出了什么问题?我希望书面文本文件显示出现在R中的字符串.

这是在Windows 7,R版本2.15

Slo*_*ner 15

这是Windows中R的烦人"功能".到目前为止,我找到的唯一解决方案是临时和编程地将您的语言环境切换到解码相关文本脚本所需的适当语言环境.因此,在上述情况下,您将使用日语语言环境.

## This won't work on Windows
str <- "????????"
Encoding(str) #returns "UTF-8"
write.table(str, file="c:/chartest.txt", quote=F, col.names=F, row.names=F)
## The following should work on Windows - first grab and save your existing locale
print(Sys.getlocale(category = "LC_CTYPE"))
original_ctype <- Sys.getlocale(category = "LC_CTYPE")
## Switch to the appropriate local for the script
Sys.setlocale("LC_CTYPE","japanese")
## Now you can write your text out and have it look as you would expect
write.table(str, "c:/chartest2.txt", quote = FALSE, col.names = FALSE, 
            row.names = FALSE, sep = "\t", fileEncoding = "UTF-8")
## ...and don't forget to switch back
Sys.setlocale("LC_CTYPE", original_ctype)
Run Code Online (Sandbox Code Playgroud)

上面会生成您在此屏幕截图中可以看到的两个文件.第一个文件显示Unicode代码点,这不是您想要的,而第二个文件显示您通常期望的字形.

日文文本

到目前为止,没有人能够向我解释为什么在R中发生这种情况.这不是Windows不可避免的特性,因为Perl,正如我在这篇文章中提到的,以某种方式解决了这个问题.


pla*_*pus 2

您尝试过使用论证fileEncoding吗?

write.table(str, file="chartest", quote=F, col.names=F, row.names=F, fileEncoding="UTF-8")
Run Code Online (Sandbox Code Playgroud)