gpt4 book ai didi

mysql - 为什么 ruby​​ 检测不到无效编码而 mysql 检测到?

转载 作者:可可西里 更新时间:2023-11-01 08:21:51 25 4
gpt4 key购买 nike

我正在从 YouTube 中提取一些具有无效 UTF8 的 RSS 提要。我可以使用

创建一个类似的 ruby​​ 字符串
bad_utf8 = "\u{61B36}"
bad_utf8.encoding # => #<Encoding:UTF-8>
bad_utf8.valid_encoding? # => true

Ruby 认为这是一个有效的 UTF-8 编码,我很确定它不是。

与 Mysql 对话时出现这样的错误

require 'mysql2'
client = Mysql2::Client.new(:host => "localhost", :username => "root")
client.query("use test");

bad_utf8 = "\u{61B36}"
client.query("INSERT INTO utf8 VALUES ('#{moo}')")

# Incorrect string value: '\xF1\xA1\xAC\xB6' for column 'string' at row 1 (Mysql2::Error)

在将它们发送到 MySQL 之前,如何检测或修复这些无效的编码类型?

最佳答案

我不依赖于 Ruby 的内置 String.valid_encoding?,因为以下也是可能的:

irb
1.9.3-p125 :001 > bad_utf8 = "\u{0}"
=> "\u0000"
1.9.3-p125 :002 > bad_utf8.valid_encoding?
=> true
1.9.3-p125 :003 > bad_utf8.encoding
=> #<Encoding:UTF-8>

这是有效的 UTF-8(引用:https://en.wikipedia.org/wiki/Utf8),但我发现字符串中存在 NULL 字符通常是对先前转换错误的提示(例如,从 html 页面中发现的无效编码信息进行转码时).

我为“Modified UTF-8”创建了自己的验证函数,它可以采用 :bmp_only 选项来将验证限制在基本多语言平面 (0x1-0xffff)。这对于大多数现代语言来说应该足够了(引用:https://en.wikipedia.org/wiki/Unicode_plane)。

在这里找到验证器:https://gist.github.com/2295531

关于mysql - 为什么 ruby​​ 检测不到无效编码而 mysql 检测到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5931849/

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