【问题标题】:How do I remove non UTF-8 characters from a String?如何从字符串中删除非 UTF-8 字符?
【发布时间】:2018-01-23 08:16:53
【问题描述】:

我需要从字符串中删除非 UTF-8 字符。这是文本的快照。

这是我在 NPP 中打开字符串,然后将编码设置为 UTF-8 时的样子:

我认为ACKFF 是非UTF-8 字符。

我试过str.scrubstr.encode。它们似乎都不起作用。 scrub 返回相同的结果,encode 导致错误。

【问题讨论】:

  • 您能解释一下哪些字符是“非 UTF-8”吗?为什么您认为是这样?
  • 如果您看到随附的屏幕截图,我认为第一个字符不是 UTF-8。此外,向左的箭头符号。当我在此处复制并粘贴字符串时,SO 站点会自动丢弃这些字符串。所以,请参考截图。
  • 嗯,UTF-8 字符串中的所有字符都是 UTF-8 字符。否则无效。由于 ASCII 和 UTF-8 中的代码点 0-127 相同,因此它还包含 ACKFF。也许您想删除控制字符或不可打印的字符。您的预期结果是什么?
  • 我有一个问题定义,上面写着“从 /dev/urandom 读取 X 字节并删除所有非 UTF-8 字符”。也许,这意味着删除不可打印的字符。
  • UTF-8 字符由一到四个字节组成。并非每个字节(或字节序列)都是有效的 UTF-8。另一方面,并​​非每个 UTF-8 字符都可以打印或单独打印。

标签: ruby string utf-8


【解决方案1】:

我们有一些问题。

最大的问题是 Ruby 字符串存储任意字节以及假定的编码,不保证字节在该编码中有效,也没有明显的理由选择该编码。 (作为 Python 3 的重度用户,我可能会有偏见。我们永远不会谈论“将字符串从一种编码更改为另一种编码”。)

幸运的是,编辑没有吃掉你的帖子,但很难看到这一点。我猜您将字符串解码为 Windows-1252 以便显示它,这只会掩盖问题。

这是我看到的字节串:

>> s = "\x06-~$A\xA7ruG\xF9\"\x9A\f\xB6/K".b
=> "\x06-~$A\xA7ruG\xF9\"\x9A\f\xB6/K"
>> s.bytes
=> [6, 45, 126, 36, 65, 167, 114, 117, 71, 249, 34, 154, 12, 182, 47, 75]

而且它确实包含无效的 UTF-8 字节。

>> s.encoding
=> #<Encoding:ASCII-8BIT>
>> String::new(s).force_encoding(Encoding::UTF_8).valid_encoding?
=> false

我们可以要求将其解码为 UTF-8 并在遇到 bytes 的地方插入不是有效的 UTF-8:

>> s.encode('utf-8', 'binary', :undef => :replace)
=> "\u0006-~$A�ruG�\"�\f�/K"

【讨论】:

  • 我想这就是我需要的。但是那个二进制文件是干什么用的?我看到有和没有它的类似结果。
  • 我不完全确定。它是 ASCII_8BIT 的同义词,我使用它是为了清楚起见,以防s 的编码在我身上发生了变化。文档给出了encode 方法的三种形式,但我无法确定需要哪种调用。
猜你喜欢
  • 2018-01-05
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 2019-04-30
  • 2020-06-01
  • 2011-04-04
  • 1970-01-01
  • 2013-12-22
相关资源
最近更新 更多