stringr
有一种奇怪的行为,这真的让我很烦。stringr
在没有警告的情况下改变了一些包含异域字符的字符串的编码,在我的例子中,还有一些.如果您str_trim
一个字符向量,那么那些带有外来字母的字符将被转换为新的编码。
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
。
Encoding(paste(' ', Letters)) # 'unknown'
Encoding(str_c(' ', Letters)) # mixed
Encoding(sub('^ +', '', paste(' ', Letters))) # mixed
发布于 2015-11-06 12:06:10
R并不总是使编码之间的转换变得容易(有函数iconv
,但这个函数所接受的是平台相关的)。但是,至少可以始终将字符串的编码标记重置为“未知”:
Letters = str_trim(Letters)
Encoding(Letters)
# [1] "unknown" "UTF-8"
Encoding(Letters) = ''
Encoding(Letters)
# [1] "unknown" "unknown"
但是,请注意,这只标志着字符串的编码,它实际上并不会重新编码字符串。因此,这可能会导致数据的混淆。正如评论中提到的,这充其量只是一次黑客攻击,而不是实际解决问题的方法。
Encoding
举例说明了R在编码方面的困难。文件上说:
ASCII字符串永远不会用声明的编码标记,因为它们在所有受支持的编码中的表示都是相同的。
…这显然毫无帮助(而且还有点误导;仅由代码点< 128组成的UTF-8字符串在ASCII字符串看来可能难以区分,但对它的操作应该根据编码产生不同的结果,这就是为什么应该有效地标记它)。
有趣的是,enc2native
和enc2utf8
在这里都不会做想要的事情--它们都会为Letters
中的两个字符串产生不同的编码,这是上面提到的Encoding
问题的直接后果。
发布于 2015-11-03 01:55:28
stringr
正在更改编码,因为stringr
是stringi
包的包装器,而stringi
总是在UTF-8中编码。有关此设计选择的详细信息和说明,请参见help("stringi-encoding", package = "stringi")
。
为了避免合并data.table
的问题,只需确保所有id
变量都用UTF-8编码。您可以在stri_enc_toutf8
包中使用stringi
,也可以使用iconv
。
https://stackoverflow.com/questions/33482308
复制相似问题