【问题标题】:Ruby 1.8.6 - process mix of utf8 codes and regular charactersRuby 1.8.6 - 处理 utf8 代码和常规字符的混合
【发布时间】:2015-05-05 08:35:48
【问题描述】:

我有一个 Rails 2.2.2 和 Ruby 1.8.6 应用程序,它刚刚遇到了一个奇怪的错误。有一个提交表单的页面,其中一个表单输入值通过参数作为"L\001A\001K\0012\0013\0010\0017" 传递。

事实证明,该值是从 PDF 复制到文本字段中的 - 在 pdf 中,它看起来像“LAK2307”,但是当它被复制到输入中时,"\001" 会插入到每个字符之间。 "\001" 看起来像 "null char" 的 utf-8 编码,它是 unicode 值 1。

我无法阻止人们将其复制到输入中并提交,但我想在保存到我们的数据库之前对其进行清理。我们已经在保存之前将一些字段转换为 ASCII 字符,方法是在它们上运行以下代码:

newval = Iconv.iconv('ascii//ignore//translit', 'utf-8', oldval).first

假设这是处理此问题的最佳方法,我该如何做类似的事情将 utf8 字符转换为常规字符?在这种情况下,我想我只想将"\001" 转换为"",从而将"L\001A\001K\0012\0013\0010\0017" 转换为"LAK2307"

谢谢,马克斯

编辑 - 更改了问题的名称以更好地描述问题

EDIT2 - 我认为由于问题字符串是普通字符和 utf-8 编码字符的混合,我需要做这样的事情:

newstring = ""
oldstring.split("").each do |char|
  #test if char is a utf8 string encoded like "\001" (or "\153" etc)
  if char.is_utf8?  #made up method
    newstring << char.unencoded #made up method
  else
    newstring << char
  end
end

有几个伪代码元素 - 方法“is_utf8?”和“未编码” - 任何人都可以填写这些空白吗?

【问题讨论】:

  • this lib 一定会帮助你。我正在安装 1.8.6 :)
  • 您能显示您的字符串的代码点、字符或字节吗?
  • @MaxWilliams 方法 API 告诉它可以做到。所以认为它会有所帮助。
  • @Stefan 这就是我所做的arr = [];s.each_byte{|b| arr &lt;&lt; b};arr => [76, 1, 65, 1, 75, 1, 50, 1, 51, 1, 48, 1, 55]

标签: ruby-on-rails ruby unicode encoding utf-8


【解决方案1】:

我想你想要encode

a = "L\001A\001K\0012\0013\0010\0017"
a.encode!("ISO-8859-1", :undef => :replace, :invalid => :replace, :replace => "")
puts a # => LAK2307

【讨论】:

  • 太糟糕了,它可以追溯到 1.9.3 :(
  • 我看看能不能看到源码。
猜你喜欢
  • 2017-02-17
  • 2019-10-31
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
相关资源
最近更新 更多