【问题标题】:Are ruby strings that return true for #ascii_only? a subset of strings that return true for Activesupport's #is_utf8?#ascii_only 是否返回 true 的 ruby​​ 字符串?为 Activesupport 的 #is_utf8 返回 true 的字符串子集?
【发布时间】:2020-02-14 22:55:19
【问题描述】:

我需要确定是否有大量未知编码的字符是 utf8。我正在使用 ActiveSupport #is_utf8?,但是它很慢,因为它复制了字符串。我想知道是否可以使用 #ascii_only 放置一个保护子句。我的测试表明这会提高我的utf8的性能吗?方法。

原方法:

def utf8? character
  character.is_utf8?
end

更快的方法:

def utf8? character
  return true if character.ascii_only?
  character.is_utf8?
end

是否有一个字符会为 ActiveSupport 的 String#is_utf8 返回 false? 会为 String#ascii_only 返回 true?

【问题讨论】:

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


    【解决方案1】:

    是否有一个字符会为 ActiveSupport 的 String#is_utf8 返回 false? [and] String#ascii_only 是真的吗?

    根据UTF-8的定义,是没有这个字符的。

    Unicode的前128个字符..与ASCII一一对应 (https://en.m.wikipedia.org/wiki/UTF-8)

    但是,这些函数是否尊重这个定义?是的,他们有。 :)

    ascii_only? 返回真只对字符 0..127,无论我们指定哪种编码。

    127.chr(Encoding::ASCII_8BIT).ascii_only? #=> true
    128.chr(Encoding::ASCII_8BIT).ascii_only? #=> false
    127.chr(Encoding::UTF_8).ascii_only? #=> true
    128.chr(Encoding::UTF_8).ascii_only? #=> false
    

    现在让我们看看is_utf8?。要回答我们的问题,我们只需要考虑字符0..127

    (0..127).any? { |i| !i.chr(Encoding::ASCII_8BIT).is_utf8? }
    #=> false
    

    0..127 范围内,没有is_utf8? 对其返回false 的字符。

    【讨论】:

    • 有趣的旁注,mail gem monkey-patches String#ascii_only?。见/mail/core_extensions/string.rb。所以,如果你使用那个 gem,那是我没有研究过的另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2020-01-27
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    相关资源
    最近更新 更多