从UTF-8字符串中删除不可见字符

3
我有一个包含UTF-8字符列的R tibble。当我打印这个列的内容时,对于某个问题记录,一切看起来都很正常:one ‭two‬ three。然而,当我尝试在R中构建并发送到数据库的RDBMS查询中使用此字符串时,出现了问题。
如果我将此字符串复制到Notepad++并转换为ANSI编码,我可以看到该字符串实际上包含一些额外的字符,这会导致问题:one ‭two‬ three
一个部分有效的解决方案是将其转换为ASCII:iconv(my_string, "UTF-8", "ASCII", sub = ""),但是所有非ASCII字符都会丢失。
从UTF-8转换为UTF-8无法解决我的问题:iconv(my_string, "UTF-8", "UTF-8", sub = "")
是否可能删除所有像上面那样的不可见字符,而不会丢失UTF-8编码? 也就是说: 如何将我的字符串转换为我在R中打印时看到的形式(没有隐藏部分)?

1
我不清楚你所说的“不可见字符”是什么意思。有很多可能的解释。其中一种似乎更像是编码问题。你的数据库、驱动程序或某些中间客户端不知道你正在使用UTF-8。这是一个非常普遍的问题。 - Giacomo Catenazzi
你所提到的问题是什么? - Tom Blodget
2个回答

2
我不确定我完全理解你想做什么,但你可以使用 stringi stringr 来明确指定要保留的字符。 对于你的示例,它可能看起来像这样。 您可能需要扩展您想要保留的字符,但这种方法是一种选择: "最初的回答"
library(stringr)

my_string <- "one ‭two‬ three"

# Specifying that you only want upper and lowercase letters, 
# numbers, punctuation, and whitespace. 
str_remove_all(my_string, "[^A-z|0-9|[:punct:]|\\s]")
[1] "one two three"

# Just checking
stringi::stri_enc_isutf8(str_remove_all(my_string, "[^A-z|0-9|[:punct:]|\\s]"))
[1] TRUE

编辑:我想指出,您应该检查并了解此方法的健壮性。我很少处理不可见字符,因此这可能不是去除它们的最佳方法。

最初的回答:


1
您没有提供构建“坏字符串”的方法,因此我无法在您的数据上进行测试,但它可以在此示例上运行。
badString <- "one \u200Btwo\u200B three"

chars <- strsplit(badString, "")[[1]]  # Assume badString has one entry; if not, add a loop

chars <- chars[nchar(chars, type = "width") > 0]

goodString <- paste(chars, collapse = "")

当打印时,badStringgoodString 看起来相同:

> badString
[1] "one ​two​ three"
> goodString
[1] "one two three"

但它们具有不同的字符数:

> nchar(badString)
[1] 15
> nchar(goodString)
[1] 13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接