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

R 从UTF-8字符串中删除不可见字符,r,character-encoding,R,Character Encoding,我有一个带UTF-8字符的列。当我为某个有问题的记录打印此列的内容时,一切看起来都很好:one‭二‬ 三个。然而,当我尝试在RDBMS查询中使用这个字符串时,会出现一些问题,我在R中构造了这个字符串并将其发送到数据库 如果我将此字符串复制到Notepad++并将编码转换为ANSI,我可以看到该字符串实际上包含一些导致问题的附加字符:one–two–three 部分可行的解决方案是转换为ASCII: iconv(我的字符串,“UTF-8”,“ASCII”,sub=”“) ,但此处会丢失所有非ASC

我有一个带UTF-8字符的列。当我为某个有问题的记录打印此列的内容时,一切看起来都很好:
one‭二‬ 三个
。然而,当我尝试在RDBMS查询中使用这个字符串时,会出现一些问题,我在R中构造了这个字符串并将其发送到数据库

如果我将此字符串复制到Notepad++并将编码转换为ANSI,我可以看到该字符串实际上包含一些导致问题的附加字符:
one–two–three

部分可行的解决方案是转换为ASCII:
iconv(我的字符串,“UTF-8”,“ASCII”,sub=”“)
,但此处会丢失所有非ASCII字符

从UTF-8转换为UTF-8并不能解决我的问题:
iconv(我的字符串“UTF-8”、“UTF-8”,sub=”“)

是否可以在不丢失UTF-8编码的情况下删除所有上述不可见字符? 即:
如何将字符串转换为在R中打印时看到的格式(没有隐藏部分)?

我不确定是否完全理解您要执行的操作,但您可以使用
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
库(stringr)

my_string您没有给我们提供构造坏字符串的方法,因此我无法对您的数据进行测试,但它在本例中有效

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 = "")
但它们的字符数不同:

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

我不清楚你说的“看不见的魔咒”是什么意思。有许多可能的解释方法。首先,它似乎更像是一个编码问题。您的数据库、驱动程序或某些中间客户端不知道您正在使用UTF-8。非常常见的问题你提到的问题是什么?
> nchar(badString)
[1] 15
> nchar(goodString)
[1] 13