至少在某些情况下,亚洲字符如果包含在a matrix或a中vector,则不可打印,但不包含在a中data.frame.这是一个例子
q<-'?'
q # Works
# [1] "?"
matrix(q) # Works
# [,1]
# [1,] "?"
q2<-data.frame(q,stringsAsFactors=FALSE)
q2 # Does not work
# q
# 1 <U+5929>
q2[1,] # Works again.
# [1] "?"
Run Code Online (Sandbox Code Playgroud)
显然,我的设备能够显示角色,但是当它在a中时data.frame,它不起作用.
做一些挖掘,我发现该print.data.frame函数format在每列上运行.事实证明,如果format.default直接运行,会出现同样的问题:
format(q)
# "<U+5929>"
Run Code Online (Sandbox Code Playgroud)
深入研究format.default,我发现它是format用C语言编写的.
在我进一步挖掘之前,我想知道其他人是否可以重现这种行为.是否有一些R配置允许我在data.frames中显示这些字符?
我的sessionInfo(),如果它有帮助:
R version 3.0.1 (2013-05-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_Canada.1252 LC_CTYPE=English_Canada.1252
[3] LC_MONETARY=English_Canada.1252 LC_NUMERIC=C
[5] …Run Code Online (Sandbox Code Playgroud) 虽然R似乎在内部很好地处理Unicode字符,但是我无法在R中输出具有这种UTF-8 Unicode字符的数据帧.有没有办法强迫这个?
data.frame(c("h?ersumian","?mettigan"))->test
write.table(test,"test.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
Run Code Online (Sandbox Code Playgroud)
输出文本文件如下:
hiersumian <U+01E3>mettigan
我在Windows环境(Windows 7)中使用R 3.0.2版.
编辑
在答案中已经建议R正确地以UTF-8编写文件,问题在于我用来查看文件的软件.这里有一些代码,我在R中做所有事情.我正在用UTF-8编码的文本文件中读取,并且R正确读取它.然后R将文件写入UTF-8并再次读回,现在正确的Unicode字符消失了.
read.table("myinputfile.txt",encoding="UTF-8")->myinputfile
myinputfile[1,1]
write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile
myoutputfile[1,1]
Run Code Online (Sandbox Code Playgroud)
控制台输出:
> read.table("myinputfile.txt",encoding="UTF-8")->myinputfile
> myinputfile[1,1]
[1] h?ersumian
Levels: h?ersumian ?mettigan
> write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
> read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile
> myoutputfile[1,1]
[1] <U+FEFF>hiersumian
Levels: <U+01E3>mettigan <U+FEFF>hiersumian
>
Run Code Online (Sandbox Code Playgroud) 我在Windows 7 64位上使用R 2.15.0.我想将unicode(CJK)文本输出到文件.
以下代码显示了发送到UTF-8文件连接上的Unicode字符如何不能正常工作(I):
rty <- file("test.txt",encoding="UTF-8")
write("?", file=rty)
close(rty)
rty <- file("test.txt",encoding="UTF-8")
scan(rty,what=character())
close(rty)
Run Code Online (Sandbox Code Playgroud)
如扫描输出所示:
Read 1 item
[1] "<U+5728>"
Run Code Online (Sandbox Code Playgroud)
该文件不是用UTF字符本身编写的,而是某种符合ANSI标准的回退.我可以让它第一次正常工作(即使用其中包含"在"的文本文件),或者我可以使用一些额外的魔法将输出转换为Unicode,并使用正确的字符替换代码字符串吗?
谢谢.
[更多信息:相同的代码在Cygwin,R 2.14.2中正常运行,而Win7上的2.14.2也被破坏.这是在我的某个地方吗?]
我的系统:win7 + R-3.0.2.
> Sys.getlocale()
[1] "LC_COLLATE=Chinese (Simplified)_People's Republic of China.936;LC_CTYPE=Chinese
(Simplified)_People's Republic of China.936;LC_MONETARY=Chinese (Simplified)_People's
republic of China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_People's Republic of China.936"
Run Code Online (Sandbox Code Playgroud)
在microsoft记事本中保存了两个具有相同内容的文件:一个保存为ansi格式,另一个保存为utf8格式.数据是M370马来西亚航空公司的死亡名称.或者您可以通过这种方式创建文件.
1)将数据复制到microsoft记事本中.
????,??,????
HuangTianhui,?,1948/05/28
???,?,1952/03/27
???,?,1994/12/09
Run Code Online (Sandbox Code Playgroud)
2)将其作为带有ansi格式的test.ansi保存在记事本中.
3)在记事本中将utf-8格式保存为test.utf8.
read.table("test.ansi",sep=",",header=TRUE) #can work fine
read.table("test.utf8",sep=",",header=TRUE) #can't work
Run Code Online (Sandbox Code Playgroud)
然后,我将编码设置为utf-8.
options(encoding="utf-8")
read.table("test.utf8",sep=",",header=TRUE,encoding="utf-8")
In read.table("test.utf8", sep = ",",header=TRUE,encoding = "utf-8") :
invalid input found on input connection 'test.utf8'
Run Code Online (Sandbox Code Playgroud)
如何读取数据文件(test.utf8)?
在python中,它非常简单
rfile=open("g:\\test.utf8","r",encoding="utf-8").read()
rfile
'\ufeff????,??,????\n\nHuangTianhui,?,1948/05/28\n\n???,?,1952/03
/27\n\n???,?,1994/12/09'
rfile.replace("\n\n","\n").replace("\ufeff","").splitlines()
['????,??,????', 'HuangTianhui,?,1948/05/28', '???,?,1952/03/27',
'???,?,1994/12/09']
Run Code Online (Sandbox Code Playgroud)
Python可以比R做得更好.
我像Sathish所说的那样,问题解决了一点,仍然保留了一些.
我发现当数据在data.frame中时,它无法正常显示,
当数据是一列data.frame时,它可以正常显示
,当数据是一行data.frame时,它就足够奇怪了,它无法正常显示.
