如何从字符串中删除不可打印的不可见字符?

How can I remove non-printable invisible characters from string?

如何从字符串中删除不可打印的不可见字符?

Ruby版本:2.4.1

2.4.1 :209 > product.name.gsub(/[^[:print:]]/,'.')
 => "Kanha‬" 
2.4.1 :210 > product.name.gsub(/[^[:print:]]/,'.').length
 => 6 

2.4.1 :212 > product.name.gsub(/[\u0080-\u00ff]/, '').length
 => 6 

2.4.1 :214 > product.name.chars.reject { |char| char.ascii_only? and (char.ord < 32 or char.ord == 127) }.join.length
 => 6 

2.4.1 :216 > product.name.gsub(/[^[:print:]]/i, '').length
 => 6 

单词"Kanha"有5个字母。但是,第 6 个字符不可打印。我怎样才能删除它?

通过谷歌搜索和 SOing,我已经尝试了几种方法,但如您所见,其中 none 是有帮助的。

当我尝试将数据与其他系统集成时出现问题。

首先,让我们弄清楚违规字符是什么:

str = "Kanha‬"
p str.codepoints
# => [75, 97, 110, 104, 97, 8236]

前五个代码点介于 0 和 127 之间,表示它们是 ASCII 字符。可以安全地假设它们是字母 K-a-n-h-a,尽管如果您愿意,这很容易验证:

p [75, 97, 110, 104, 97].map(&:ord)
# => ["K", "a", "n", "h", "a"]

这意味着违规字符是最后一个字符,代码点 8236。不过,这是一个十进制(基数 10)数字,而 Unicode 字符通常按其十六进制(基数 16)数字列出。 8236的十六进制是202C(8236.to_s(16) # => "202c"),所以我们只需要google for U+202C.

Google 很快告诉我们违规字符是 U+202C POP DIRECTIONAL FORMATTING and that it's a member of the "Other, Format" category of Unicode characters. Wikipedia says 这个类别:

Includes the soft hyphen, joining control characters (zwnj and zwj), control characters to support bi-directional text, and language tag characters

它还告诉我们 "value" 或类别代码是 "Cf"。如果这些听起来像您想要从字符串中删除的字符以及 U+202C,您可以在 Ruby 正则表达式中使用 the \p{Cf} property。您还可以使用 \P{Print}(注意大写 P)等同于 [^[:print]]:

str = "Kanha‬"
p str.length # => 6

p str.gsub(/\P{Print}|\p{Cf}/, '') # => "Kahna"
p str.gsub(/\P{Print}|\p{Cf}/, '').length # => 5

在 repl.it 上查看:https://repl.it/@jrunning/DutifulRashTag