如何从字符串中删除不可打印的不可见字符?
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
如何从字符串中删除不可打印的不可见字符?
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