虽然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) 使用R,我试图刮一个网页,将日文文本保存到文件中.最终,这需要扩展到每天处理数百页.我已经在Perl中有一个可行的解决方案,但我正在尝试将脚本迁移到R以减少在多种语言之间切换的认知负荷.到目前为止,我没有成功.相关的问题似乎是关于保存csv文件和将此希伯来文写入HTML文件的问题.但是,我没有成功地根据那里的答案拼凑出一个解决方案.编辑:关于R的UTF-8输出的这个问题也是相关的但是没有解决.
这些页面来自Yahoo! 日本财务和我的Perl代码看起来像这样.
use strict;
use HTML::Tree;
use LWP::Simple;
#use Encode;
use utf8;
binmode STDOUT, ":utf8";
my @arr_links = ();
$arr_links[1] = "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7203";
$arr_links[2] = "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7201";
foreach my $link (@arr_links){
$link =~ s/"//gi;
print("$link\n");
my $content = get($link);
my $tree = HTML::Tree->new();
$tree->parse($content);
my $bar = $tree->as_text;
open OUTFILE, ">>:utf8", join("","c:/", substr($link, -4),"_perl.txt") || die;
print OUTFILE $bar;
}
Run Code Online (Sandbox Code Playgroud)
此Perl脚本生成一个类似于下面屏幕截图的CSV文件,其中包含可以离线挖掘和操作的正确的汉字和假名:

我的R代码,如下所示,如下所示.R脚本与刚刚给出的Perl解决方案不完全相同,因为它不会删除HTML并留下文本(这个答案暗示了一种使用R的方法,但在这种情况下它对我不起作用)并且它没有循环等等,但意图是一样的.
require(RCurl)
require(XML)
links <- list()
links[1] <- "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7203"
links[2] <- "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7201"
txt …Run Code Online (Sandbox Code Playgroud) 我已经想过如何编写Unicode字符串,但仍然对它的工作原理感到困惑.
str <- "?"
Encoding(str) # UTF-8
cat(str, file="no-iconv") # Written wrongly as <U+1ECF>
cat(iconv(str, to="UTF-8"), file="yes-iconv") # Written correctly as ?
Run Code Online (Sandbox Code Playgroud)
我理解为什么这种no-iconv方法不起作用.这是因为cat(writeLines以及)首先将字符串转换为本机编码,然后再转换为to=编码.在Windows上,这意味着R转换?为Windows-1252第一个,无法理解?,导致<U+1ECF>.
我不明白的是这种yes-iconv方法的原理.如果我理解正确,iconv这里只是返回一个带UTF-8编码的字符串.但str已经在UTF-8!为什么要iconv有所作为?另外,当iconv(str, to="UTF-8")传递到cat,不应该cat首先转换为Windows-1252?
我很困惑为什么某些字符(例如“?”、“?”和“?”)在数据框中丢失了它们的变音符号,而其他字符(例如“Š”和“š”)不会。顺便说一下,我的操作系统是 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 …Run Code Online (Sandbox Code Playgroud)