【问题标题】:Coping with "string contains null byte" sent from users处理用户发送的“字符串包含空字节”
【发布时间】:2015-06-01 22:38:10
【问题描述】:

我有一个 API 控制器,它接收有关媒体文件路径和 id3 标签的信息,并使用 PostgreSQL/Rails 将它们保存到 Active Record 实例。

但有时用户会发送如下字符串:

"genre"=>"Hip-Hop\u0000Hip-Hop/Rap"

Rails/Postgres 在尝试坚持save 时对此并不满意:

An ArgumentError occurred in internals#receive:

 string contains null byte
 activerecord (3.2.21) lib/active_record/connection_adapters/postgresql_adapter.rb:1172:in `send_query_prepared'

如何在 Ruby 中清除此字符串以完全删除空字节?

【问题讨论】:

  • 您正在接收 UTF-16 编码的文本。我建议不要尝试“清理它”,而是与发件人确认这一点,如果是这种情况,请使用 Ruby 的编码将文本转换为 UTF-8。如果它发生在其他变音符号上,则随意剥离角色将无济于事。此外,如果您尝试将一个以一种方式编码的字符串存储到为另一种编码类型定义的字段中,那么 Ruby 和 PostgreSQL 都可能会感到不安,因此您需要彻底。
  • 不幸的是,用户遍布世界各地,我不能要求他们更改这些内容,因此必须在服务器端进行修复,即使这些数据是由我们和第三方应用程序发送的。
  • 可以检查一个字符串,看看是否可以确定它的编码。有时你会很幸运,得到一个实际上都是一种编码的字符串,这样就很容易找到你要去的地方。有时你会得到一个包含多个编码的字符串,然后必须为此编码,但如何让你弄清楚。除非他们非常需要您的 API/服务,否则不太可能要求人们改变您。这是一个非常棘手的兔子洞,它可能会演变成一个非常棘手的情况。

标签: ruby-on-rails ruby postgresql


【解决方案1】:

String 上的 gsub 方法可能是合适的。你可以通过string.gsub("\u0000", '') 来摆脱它们。

http://ruby-doc.org/core-2.1.1/String.html#method-i-gsub

【讨论】:

  • 不使用string.delete("\u0000")有什么原因吗?
  • 不,那也可以,string.tr 也可以。事实上,tr 和 delete 在这种情况下都比 gsub 更合适
猜你喜欢
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 2015-05-13
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
相关资源
最近更新 更多