为什么这些不同的编码不允许我正确显示葡萄牙语?

Why aren't these various encodings allowing me to properly display Portuguese?

提问人:Hack-R 提问时间:7/28/2017 最后编辑:Hack-R 更新时间:7/28/2017 访问量:412

问:

我正在做一些涉及葡萄牙语文本的文本挖掘。我的一些自定义文本挖掘函数中还包含其他特殊字符。

我不是这个话题的专家。当我的许多字符开始显示不正确时,我认为我需要更改文件编码。我试过了

  • ISO-8858-1认证
  • ISO-8858-7认证
  • UTF-8 格式
  • 视窗-1252

它们都没有改善字符的显示。我是否需要不同的编码,或者我是否做错了?

例如,当我尝试从 GitHub 读取此非索引字列表时:

stop_words <- read.table("https://gist.githubusercontent.com/alopes/5358189/raw/2107d809cca6b83ce3d8e04dbd9463283025284f/stopwords.txt") 

他们是这样出来的:

tail(stop_words, 17)
206    tivéramos
207         tenha
208      tenhamos
209        tenham
210       tivesse
211   tivéssemos
212      tivessem
213         tiver
214      tivermos
215       tiverem
216         terei
217         terá
218       teremos
219        terão
220         teria
221     teríamos
222        teriam

我也试过了.stringsAsFactors = F

我不会说葡萄牙语,但我的直觉告诉我,欧元和版权符号不在他们的字母表中。此外,它似乎正在将一些重音小写 e 更改为大写不同重音的 A。

如果有帮助:

Sys.getlocale()

[1] “LC_COLLATE=English_United States.1252;LC_CTYPE=English_United 国家.1252;LC_MONETARY=English_United 国家.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252”

我还尝试更改了语言环境,并且.stri_encode(stop_words$V1, "", "UTF-8")tail(enc2native(as.vector(stop_words[,1])),17)

R 文本 编码 字符编码

评论

0赞 Oriol Mirosa 7/28/2017
我不认为问题出在葡萄牙字母上。当我从 GitHub 获得带有您上面代码的stop_words时,我可以看到字符格式正确。如何更改文件编码?
0赞 Hack-R 7/28/2017
@OriolMirosa在从我的系统默认值(ISO-8859-1)更改编码之前,我遇到了问题。我尝试使用 RStudio(使用编码重新打开)更改它,然后重新提取数据。我也尝试用包装更改它。我认为下面的答案是正确的,它以某种方式被双重编码,但我不知道为什么或如何修复它。stringi
0赞 Oriol Mirosa 7/28/2017
您是否尝试过或enc2utf8(as.vector(stop_words[,1]))enc2native(as.vector(stop_words[,1]))
0赞 Hack-R 7/28/2017
@OriolMirosa我没有尝试过,谢谢。在您阅读您的评论后,我现在刚刚尝试过,但问题仍然存在。
0赞 Oriol Mirosa 7/28/2017
嗯。。。你在什么系统中?你使用 RStudio 吗?您的 R 终端使用什么字体?你能在终端中看到波浪号和其他拉丁字符吗?(如果您的键盘是英文的,请按 alt+e,然后按 e 得到“é”)

答:

1赞 Alexandre Mercier Aubin 7/28/2017 #1

您似乎正在对 utf-8 进行双重编码。

下面是 utf-8 中的字符图表:http://www.i18nqa.com/debug/utf8-debug.html
现在看看“实际”列。

如您所见,打印的字符似乎表示实际值,而不是编码值。

一个临时的解决方法是解码一层 utf-8。

更新:

安装 R 后,我试图重现该问题。
这是我的控制台日志,有一个简单的解释:

首先,我复制粘贴了您的代码:

> stop_words <- read.table("https://gist.githubusercontent.com/alopes/5358189/raw/2107d809cca6b83ce3d8e04dbd9463283025284f/stopwords.txt")
> tail(stop_words, 17)
             V1
206  tivéramos
207       tenha
208    tenhamos
209      tenham
210     tivesse
211 tivéssemos
212    tivessem
213       tiver
214    tivermos
215     tiverem
216       terei
217       terá
218     teremos
219      terão
220       teria
221   teríamos
222      teriam

好的,所以它没有按原样工作,所以我在 read.table 函数的末尾添加了编码参数。 当我尝试使用小写的 utf-8 时,结果如下:

> stop_words <- read.table("https://gist.githubusercontent.com/alopes/5358189/raw/2107d809cca6b83ce3d8e04dbd9463283025284f/stopwords.txt",encoding="utf-8")
> tail(stop_words, 17)
             V1
206  tivéramos
207       tenha
208    tenhamos
209      tenham
210     tivesse
211 tivéssemos
212    tivessem
213       tiver
214    tivermos
215     tiverem
216       terei
217       terá
218     teremos
219      terão
220       teria
221   teríamos
222      teriam

最后,我使用了带有大写字母的 UTF-8,现在它可以正常工作:

> stop_words <- read.table("https://gist.githubusercontent.com/alopes/5358189/raw/2107d809cca6b83ce3d8e04dbd9463283025284f/stopwords.txt", encoding = "UTF-8")
> tail(stop_words, 17)
            V1
206  tivéramos
207      tenha
208   tenhamos
209     tenham
210    tivesse
211 tivéssemos
212   tivessem
213      tiver
214   tivermos
215    tiverem
216      terei
217       terá
218    teremos
219      terão
220      teria
221   teríamos
222     teriam

您可能忘记将编码参数放在 read.table 的末尾,或者尝试使用小写而不是大写。我从中了解到的是,如果您不指定字符已在其中编码,则 R 会尝试将字符转换为 UTF-8。

评论

0赞 Hack-R 7/28/2017
我从图表中可以看出你是对的。我正试图弄清楚如何遵循你的建议。如果您知道如何操作,您能否向我展示使用链接的 GitHub 文本?我看到一些如何在 Python 中修复双重编码的示例,但不是 R。
1赞 Alexandre Mercier Aubin 7/28/2017
如果没有找到答案,我可能会在以后研究这个问题。
1赞 Rui Barradas 7/28/2017 #2

我是葡萄牙人,虽然我的编码是

Sys.getlocale()
[1] "LC_COLLATE=Portuguese_Portugal.1252;LC_CTYPE=Portuguese_Portugal.1252;LC_MONETARY=Portuguese_Portugal.1252;LC_NUMERIC=C;LC_TIME=Portuguese_Portugal.1252"

所以我在网上查了一下,在SO中找到了这个技巧。

stop_words2 <- sapply(stop_words, as.character)

成功了。但是我使用 .read.table(..., stringsAsfactors = FALSE)

评论

0赞 Hack-R 7/28/2017
谢谢。这对我不起作用,但我们可以为将来可能遇到与您的情况相同的问题/解决方案的读者保留答案。
0赞 Rui Barradas 7/28/2017
@Hack-R:也许由于你的语言环境原因,它不起作用。你不能改变它吗?