gpt4 book ai didi

ruby - 如何摆脱 ruby 中的非ascii字符

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

我有一个 Ruby CGI(不是 Rails),可以从 Web 表单中挑选照片和标题。我的用户非常热衷于使用智能引号和连字,他们从其他来源粘贴。我的网络应用程序不能很好地处理这些非 ASCII 字符,是否有快速的 Ruby 字符串操作例程可以摆脱非 ASCII 字符?

最佳答案

使用字符串#encode

从 Ruby 1.9 开始,在字符串编码之间进行转换的官方方法是使用 String#encode .

要简单地删除非 ASCII 字符,您可以这样做:

some_ascii   = "abc"
some_unicode = "áëëçüñżλφθΩ𠜎😸"
more_ascii = "123ABC"
invalid_byte = "\255"

non_ascii_string = [some_ascii, some_unicode, more_ascii, invalid_byte].join

# See String#encode documentation
encoding_options = {
:invalid => :replace, # Replace invalid byte sequences
:undef => :replace, # Replace anything not defined in ASCII
:replace => '', # Use a blank for those replacements
:universal_newline => true # Always break lines with \n
}

ascii = non_ascii_string.encode(Encoding.find('ASCII'), encoding_options)
puts ascii.inspect
# => "abce123ABC"

请注意,结果中的前 5 个字符是“abce1”——“á”被丢弃,一个“ë”被丢弃,但另一个“ë”似乎已转换为“e”。

这样做的原因是有时在 Unicode 中有多种方式来表达同一个书面字符。 “á”是一个单一的 Unicode 代码点。第一个“ë”也是。当 Ruby 在此转换过程中看到这些时,它会丢弃它们。

但第二个“ë”是两个代码点:一个普通的“e”,就像您在 ASCII 字符串中找到的一样,后跟一个“组合变音符号”(this one),意思是“放一个变音符号”在前一个角色上”。在 Unicode 字符串中,这些被解释为单个“字素”或可见字符。转换它时,Ruby 保留纯 ASCII“e”并丢弃组合标记。

如果您决定要提供一些特定的替换值,您可以这样做:

REPLACEMENTS = { 
'á' => "a",
'ë' => 'e',
}

encoding_options = {
:invalid => :replace, # Replace invalid byte sequences
:replace => "", # Use a blank for those replacements
:universal_newline => true, # Always break lines with \n
# For any character that isn't defined in ASCII, run this
# code to find out how to replace it
:fallback => lambda { |char|
# If no replacement is specified, use an empty string
REPLACEMENTS.fetch(char, "")
},
}

ascii = non_ascii_string.encode(Encoding.find('ASCII'), encoding_options)
puts ascii.inspect
#=> "abcaee123ABC"

更新

有些人报告了 :universal_newline 选项的问题。我间歇性地看到过这种情况,但一直无法找到原因。

发生这种情况时,我会看到 Encoding::ConverterNotFoundError: code converter not found (universal_newline)。然而,在一些 RVM 更新之后,我只是在以下 Ruby 版本下运行上面的脚本没有问题:

  • ruby-1.9.2-p290
  • ruby-1.9.3-p125
  • ruby-1.9.3-p194
  • ruby-1.9.3-p362
  • ruby-2.0.0-preview2
  • ruby-head(截至 12-31-2012)

鉴于此,它似乎不是弃用的功能,甚至不是 Ruby 中的错误。如果有人知道原因,请发表评论。

关于ruby - 如何摆脱 ruby 中的非ascii字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1268289/

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