为何R中完全相同的Unicode字符串序列化结果不一致?
问题原因分析
- 核心差异来自R字符串的内部编码标记,
serialize会存储对象完整内部信息,而普通相等判断默认忽略该标记:identical函数的ignore.encoding参数默认值为TRUE,只要字符串的字符内容匹配,即使内部编码标记不同也会返回TRUEcharToRaw仅输出字符串对应的字节序列,和内部编码标记无关,只要字符内容一致返回结果就相同serialize会完整序列化R对象的所有内部属性,包括字符串的编码标记,两个标记不同的字符串序列化结果自然不同
验证方法
你可以在测试代码中加入以下语句,直接查看两个字符串的编码标记差异:
print(c(Encoding(x), Encoding("α")))
运行后你大概率会得到如下输出:
[1] "UTF-8" "unknown"
产生差异的原因是:source读取外部脚本文件时,会明确给读取到的非ASCII字符串打上UTF-8编码标记;而命令行-e参数内的字符串是R直接从命令行参数读取的,默认会被标记为unknown编码(虽然实际存储字节同样是UTF-8)。
你可以手动修改编码标记验证结论:
y <- "α" Encoding(y) <- "UTF-8" # 此时序列化结果就会完全一致 print(identical(serialize(x, NULL), serialize(y, NULL)))
你也可以将identical的ignore.encoding参数设为FALSE,此时原本返回TRUE的相等判断也会返回FALSE:
print(identical(x, "α", ignore.encoding = FALSE)) # 输出 [1] FALSE
内容的提问来源于stack exchange,提问作者Kodiologist
相关产品推荐
相关产品推荐

