#ascii_onlyに対してtrueを返すルビー文字列はありますか? Activesupportの#is_utf8に対してtrueを返す文字列のサブセット?

2020-02-15 ruby-on-rails ruby utf-8

エンコードが不明な非常に多くの文字が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を返しますか?

Answers

ActiveSupportのString#is_utf8に対してfalseを返す文字はありますか? [および] String#ascii_onlyに対してtrue?

UTF-8の定義によれば、そのような文字はありません。

Unicodeの最初の128文字は、ASCIIと1対1で対応しています ( https://en.m.wikipedia.org/wiki/UTF-8

しかし、これらの関数はこの定義を尊重しますか?はい、彼らはやる。 :)

ascii_only?指定したエンコーディングに関係なく、 文字0..127に対してのみ trueを返します。

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?見てみましょうis_utf8? 。質問に答えるには、文字0..127のみを考慮する必要があります。

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

0..127の範囲には、 is_utf8?文字はありis_utf8? falseを返します。

Related