gpt4 book ai didi

ruby 1.9,force_encoding,但检查

转载 作者:数据小太阳 更新时间:2023-10-29 06:28:08 26 4
gpt4 key购买 nike

我有一个从某种输入中读取的字符串。

据我所知,它是 UTF8。好的:

string.force_encoding("utf8")

但是如果这个字符串中的字节实际上不是合法的 UTF8,我想现在就知道并采取行动。

一般遇到这样的字节,force_encoding("utf8") 会引发吗?我相信不会。

如果我在做 #encode我可以从方便的选项中选择如何处理源编码(或目标编码)中无效的字符。

但我不是在执行#encode,而是在执行#force_encoding。它没有这样的选项。

这是否有意义

string.force_encoding("utf8").encode("utf8")

立即获得异常?通常编码 from utf8 to utf8 没有任何意义。但也许这是让它在存在无效字节时立即提升的方法?或者使用 :replace 选项等对无效字节做一些不同的事情?

但是不,似乎也无法实现。

有人知道吗?

1.9.3-p0 :032 > a = "bad: \xc3\x28 okay".force_encoding("utf-8")
=> "bad: \xC3( okay"
1.9.3-p0 :033 > a.valid_encoding?
=> false

好的,但是我如何找到并消除那些坏字节呢?奇怪的是,这不会引发:

1.9.3-p0 :035 > a.encode("utf-8")
=> "bad: \xC3( okay"

如果我要转换为不同的编码,它会!

1.9.3-p0 :039 > a.encode("ISO-8859-1")
Encoding::InvalidByteSequenceError: "\xC3" followed by "(" on UTF-8

或者如果我告诉它,它会用“?”替换它=>

1.9.3-p0 :040 > a.encode("ISO-8859-1", :invalid => :replace)
=> "bad: ?( okay"

所以 ruby​​ 很聪明地知道什么是 utf-8 中的坏字节,并在转换为不同的编码时用其他东西替换 em。但我不想想要转换为不同的编码,我想保留 utf8——但如果那里有无效字节我可能想提出问题,或者我可能想用替换无效字节替换字符。

有没有办法让 ruby​​ 做到这一点?

更新 我相信这最终已添加到 2.1 中的 ruby​​ 中,在 2.1 预览版中使用 String#scrub 来执行此操作。所以寻找那个!

最佳答案

(更新:参见 https://github.com/jrochkind/scrub_rb)

所以我在这里编写了一个解决方案来满足我的需求:https://github.com/jrochkind/ensure_valid_encoding/blob/master/lib/ensure_valid_encoding.rb

但直到最近我才意识到这实际上是内置在 stdlib 中的,您只需要,有点违反直觉,将“二进制”作为“源编码”传递:

a = "bad: \xc3\x28 okay".force_encoding("utf-8")
a.encode("utf-8", "binary", :undef => :replace)
=> "bad: �( okay"

是的,这正是我想要的。所以事实证明这是内置于 1.9 stdlib 中的,它只是没有记录并且很少有人知道它(或者说英语的人可能很少知道它?)。虽然我在某个博客上看到这些论点是这样使用的,所以其他人知道了!

关于ruby 1.9,force_encoding,但检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10200544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com