Dan*_*tti 5 encoding text r hebrew
我正在尝试保存RSelenium
从https://www.magna.isa.gov.il/Details.aspx?l=he中提取的数据,但是虽然R成功将希伯来字符打印到控制台,但在导出TXT时却没有CSV或在其他简易R的功能,如data.frame()
,readHTMLTable()
等
这是一个例子.
> head(lines)
[1] "????? ????? ?'?.??. 2 ??\"? ?????? ?????? ????? ???? ???\"?"
[2] "513435404"
[3] ""
[4] ""
[5] ""
[6] "4,481"
Run Code Online (Sandbox Code Playgroud)
使用时,第一行更改为奇怪的字符(下面) data.frame()
> head(as.data.frame(lines))
[1] <U+05D2><U+05DC><U+05D5><U+05D1><U+05DC> <U+05E4><U+05D9><U+05E0><U+05E0><U+05E1> <U+05D2>'<U+05D9>.<U+05D0><U+05E8>. 2 <U+05D1><U+05E2>"<U+05DE> <U+05E0><U+05EA><U+05D5><U+05E0><U+05D9><U+05DD> <U+05DB><U+05E1><U+05E4><U+05D9><U+05D9><U+05DD> <U+05D1><U+05D0><U+05DC><U+05E4><U+05D9> <U+05D3><U+05D5><U+05DC><U+05E8> <U+05D0><U+05E8><U+05D4>"<U+05D1>
Run Code Online (Sandbox Code Playgroud)
通过write.table
或导出.TXT或.CSV时也会发生同样的情况write.csv
:
write.csv(lines,"lines.csv",row.names=FALSE)
Run Code Online (Sandbox Code Playgroud)
我尝试将编码更改为"UTF-8",就像在几个相似的问题中所建议的那样,但问题仍然是以不同的格式:
iconv(lines, to = "UTF-8")
1 ?’??•?‘? ???™? ? ?¡ ?’'?™.??¨. 2 ?‘?¢"? ? ?×?•? ?™? ?›?¡???™?™? ?‘?????™ ?“?•??¨ ??¨?”"?‘
Run Code Online (Sandbox Code Playgroud)
希伯来语ISO-8859-8也是如此:
iconv(lines, to = "ISO-8859-8")
1 ×'×o×.×'×o ×?×T× × ×! ×''×T.×ר. 2 ×'×¢"×z × ×a×.× ×T× ×>×!×?×T×T× ×'××o×?×T ×"×.×oר ×ר×""×'
Run Code Online (Sandbox Code Playgroud)
我不明白为什么控制台很好地打印希伯来字符write.table()
,write.csv()
并data.frame()
提出编码问题.
有人帮我出口吗?
Ken回答了这个问题,使用writeLines()导出文本效果很好:
f = file("lines.txt", open = "wt", encoding = "UTF-8")
writeLines(lines, "lines.txt", useBytes = TRUE)
close(f)
Run Code Online (Sandbox Code Playgroud)
然而,R与希伯来语编码的主要问题是在处理表时,以as.data.frame(),write.table()和write.csv()的形式.有什么想法吗?
一些机器信息:
Sys.info()
sysname release version
"Windows" "7 x64" "build 7601, Service Pack 1"
nodename machine login
"TALIS-TP" "x86"
> 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"
Run Code Online (Sandbox Code Playgroud)
Ken*_*oit 12
许多人在具有8位系统编码的平台上使用UTF-8文本时遇到类似的问题(Windows).R中的编码可能很棘手,因为不同的方法处理编码和转换的方式不同,并且在一个平台(OS X或Linux)上运行良好的方法在另一个平台上运行不佳.
问题与输出连接以及Windows如何处理编码和文本连接有关.我试图在UTF-8和8位编码中使用一些希伯来文本来复制问题.我们也将介绍文件阅读问题,因为那里也可能存在一些障碍.
创建了一个简短的希伯来语语言文本文件,编码为UTF-8:hebrew-utf8.txt
创建了一个简短的希伯来语语言文本文件,编码为ISO-8859-8:hebrew-iso-8859-8.txt.(注意:您可能需要告诉浏览器有关编码的信息,以便正确查看此编码 - 例如Safari就是这种情况.)
现在让我们进行实验.我正在使用Windows 7进行这些测试(它实际上适用于OS X,我通常的操作系统).
lines <- readLines("http://kenbenoit.net/files/hebrew-utf8.txt")
lines
## [1] "העברי ×”×•× ×—×‘×¨ בקבוצה ×”×›× ×¢× ×™×ª של שפות שמיות."
## [2] "זו היתה ×©×¤×ª× ×©×œ ×”×™×”×•×“×™× ×ž×•×§×“×, ×בל מן 586 ×œ×¤× ×”\"ס ×–×” התחיל להיות מוחלף על ידי ב×רמית."
Run Code Online (Sandbox Code Playgroud)
这失败了,因为它假设编码是您的系统编码,Windows-1252.但是因为在读取文件时没有发生转换,所以只需将编码位设置为UTF-8即可解决此问题:
# this sets the bit for UTF-8
Encoding(lines) <- "UTF-8"
lines
## [1] "????? ??? ??? ?????? ??????? ?? ???? ?????."
## [2] "?? ???? ???? ?? ??????? ?????, ??? ?? 586 ????\"? ?? ????? ????? ????? ?? ??? ??????."
Run Code Online (Sandbox Code Playgroud)
但是,当您阅读文件时,最好这样做:
# this does it in one pass
lines2 <- readLines("http://kenbenoit.net/files/hebrew-utf8.txt", encoding = "UTF-8")
lines2[1]
## [1] "????? ??? ??? ?????? ??????? ?? ???? ?????."
Encoding(lines2)
## [1] "UTF-8" "UTF-8"
Run Code Online (Sandbox Code Playgroud)
现在看看如果我们尝试读取相同的文本,但编码为8位ISO希伯来语代码页会发生什么.
lines3 <- readLines("http://kenbenoit.net/files/hebrew-iso-8859-8.txt")
lines3[1]
## [1] "äòáøé äåà çáø á÷áåöä äëðòðéú ùì ùôåú ùîéåú."
Run Code Online (Sandbox Code Playgroud)
设置编码位在这里没有任何帮助,因为读取的内容没有映射到希伯来语的Unicode代码点,并且Encoding()
没有实际的编码转换,它只是设置一个额外的位,可用于告诉R一个可能的一个编码值.我们可以通过添加encoding = "ISO-8859-8"
到readLines()
呼叫来解决这个问题.我们还可以在加载后转换文本,使用iconv()
:
# this will not fix things
Encoding(lines3) <- "UTF-8"
lines3[1]
## [1] "\xe4\xf2\xe1\xf8\xe9 \xe4\xe5\xe0 \xe7\xe1\xf8 \xe1\xf7\xe1\xe5\xf6\xe4 \xe4\xeb\xf0\xf2\xf0\xe9\xfa \xf9\xec \xf9\xf4\xe5\xfa \xf9\xee\xe9\xe5\xfa."
# but this will
iconv(lines3, "ISO-8859-8", "UTF-8")[1]
## [1] "????? ??? ??? ?????? ??????? ?? ???? ?????."
Run Code Online (Sandbox Code Playgroud)
总的来说,我认为上面使用的方法lines2
是最好的方法.
现在回答您关于如何编写此问题的问题:最安全的方法是在较低级别控制连接,您可以在其中指定编码.否则,默认为R/Windows选择您的系统编码,这将失去UTF-8.我认为这样可以工作,它在OS X中工作得非常好 - 而OS X也可以正常工作,writeLines()
只需命名一个没有textConnection的文本文件.
## to write lines, use the encoding option of a connection object
f <- file("hebrew-output-UTF-8.txt", open = "wt", encoding = "UTF-8")
writeLines(lines2, f)
close(f)
Run Code Online (Sandbox Code Playgroud)
但它不适用于Windows.您可以在此处查看Windows 7结果:hebrew-output-UTF-8-file_encoding.txt.
所以,这里是如何在Windows中执行此操作:一旦您确定您的文本被编码为UTF-8,只需将其写为原始字节,而不使用任何编码,如下所示:
writeLines(lines2, "hebrew-output-UTF-8-useBytesTRUE.txt", useBytes = TRUE)
Run Code Online (Sandbox Code Playgroud)
你可以在hebrew-output-UTF-8-useBytesTRUE.txt看到结果,它现在是UTF-8并且看起来是正确的.
为write.csv添加
请注意,您希望这样做的唯一原因是使.csv文件可用于导入其他软件,例如Excel.(祝你好运在Excel/Windows中使用UTF-8 ......)否则,你应该将data.table写成二进制文件write(myDataFrame, file = "myDataFrame.RData")
.但如果你真的需要输出.csv,那么:
data.table
Windows中编写UTF-8 .csv文件使用write.table()
和编写UTF-8文件的问题write.csv()
是这些打开文本连接,而Windows对UTF-8的编码和文本连接有限制.(这篇文章提供了一个有用的解释.)根据这里发布的SO答案,我们可以覆盖它来编写我们自己的函数来输出UTF-8 .csv文件.
这假定您已经Encoding()
为任何字符元素设置了"UTF-8"
(在上面导入时发生lines2
).
df <- data.frame(int = 1:2, text = lines2, stringsAsFactors = FALSE)
write_utf8_csv <- function(df, file) {
firstline <- paste('"', names(df), '"', sep = "", collapse = " , ")
data <- apply(df, 1, function(x) {paste('"', x, '"', sep = "", collapse = " , ")})
writeLines(c(firstline, data), file , useBytes = TRUE)
}
write_utf8_csv(df, "df_csv.txt")
Run Code Online (Sandbox Code Playgroud)
当我们现在在非Unicode挑战的操作系统中查看该文件时,它现在看起来很好:
KBsMBP15-2:Desktop kbenoit$ cat df_csv.txt
"int" , "text"
"1" , "????? ??? ??? ?????? ??????? ?? ???? ?????."
"2" , "?? ???? ???? ?? ??????? ?????, ??? ?? 586 ????"? ?? ????? ????? ????? ?? ??? ??????."
KBsMBP15-2:Desktop kbenoit$ file df_csv.txt
df_csv.txt: UTF-8 Unicode text, with CRLF line terminators
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2568 次 |
最近记录: |