首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么字符串在操作字符串时改变编码?

为什么字符串在操作字符串时改变编码?
EN

Stack Overflow用户
提问于 2015-11-02 16:27:19
回答 3查看 1.6K关注 0票数 8

stringr有一种奇怪的行为,这真的让我很烦。stringr在没有警告的情况下改变了一些包含异域字符的字符串的编码,在我的例子中,还有一些.如果您str_trim一个字符向量,那么那些带有外来字母的字符将被转换为新的编码。

代码语言:javascript
运行
复制
letter1 <- readline('Gimme an ASCII character!')     # try q or a
letter2 <- readline('Gimme an non-ASCII character!') # try ø or é
Letters <- c(letter1, letter2)
Encoding(Letters)           # 'unknown'
Encoding(str_trim(Letters)) # mixed 'unknown' and 'UTF-8'

这是一个问题,因为我使用data.table (快速)合并大表,而且data.table不支持混合编码,也因为我找不到回到统一编码的方法。

有什么解决办法吗?

编辑:我想我可以回到基本函数,但它们既不保护编码,也不保护编码。例如,paste保存它,但不保存sub

代码语言:javascript
运行
复制
 Encoding(paste(' ', Letters))                 # 'unknown'
 Encoding(str_c(' ', Letters))                 # mixed
 Encoding(sub('^ +', '', paste(' ', Letters))) # mixed
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-06 12:06:10

R并不总是使编码之间的转换变得容易(有函数iconv,但这个函数所接受的是平台相关的)。但是,至少可以始终将字符串的编码标记重置为“未知”:

代码语言:javascript
运行
复制
Letters = str_trim(Letters)
Encoding(Letters)
# [1] "unknown" "UTF-8"
Encoding(Letters) = ''
Encoding(Letters)
# [1] "unknown" "unknown"

但是,请注意,这只标志着字符串的编码,它实际上并不会重新编码字符串。因此,这可能会导致数据的混淆。正如评论中提到的,这充其量只是一次黑客攻击,而不是实际解决问题的方法。

Encoding举例说明了R在编码方面的困难。文件上说:

ASCII字符串永远不会用声明的编码标记,因为它们在所有受支持的编码中的表示都是相同的。

…这显然毫无帮助(而且还有点误导;仅由代码点< 128组成的UTF-8字符串在ASCII字符串看来可能难以区分,但对它的操作应该根据编码产生不同的结果,这就是为什么应该有效地标记它)。

有趣的是,enc2nativeenc2utf8在这里都不会做想要的事情--它们都会为Letters中的两个字符串产生不同的编码,这是上面提到的Encoding问题的直接后果。

票数 1
EN

Stack Overflow用户

发布于 2015-11-03 01:55:28

stringr正在更改编码,因为stringrstringi包的包装器,而stringi总是在UTF-8中编码。有关此设计选择的详细信息和说明,请参见help("stringi-encoding", package = "stringi")

为了避免合并data.table的问题,只需确保所有id变量都用UTF-8编码。您可以在stri_enc_toutf8包中使用stringi,也可以使用iconv

票数 3
EN

Stack Overflow用户

发布于 2016-01-20 21:02:27

使用最近的承诺,data.table现在通过在创建data.tables时确保正确的编码以及在unique()duplicated()等函数中确保正确的编码来隐式地处理这些混合编码。

请参阅README.md中1.9.7版本的bug下面的新闻项目(23)。

如果您面临任何进一步的问题,请进行测试并回信。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33482308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档