提交 509367da 编写于 作者: E Eileen M. Uchitelle 提交者: eileencodes

Merge pull request #36690 from cpruitt/make-parameterize-requires-utf-8-explicit

Make UTF-8 string requirement explicit for `ActiveSupport::Inflector.transliterate`
上级 817965f7
...@@ -5,8 +5,9 @@ ...@@ -5,8 +5,9 @@
module ActiveSupport module ActiveSupport
module Inflector module Inflector
# Replaces non-ASCII characters with an ASCII approximation, or if none # Replaces non-ASCII characters in a UTF-8 encoded string with an ASCII
# exists, a replacement character which defaults to "?". # approximation, or if none exists, a replacement character which
# defaults to "?".
# #
# transliterate('Ærøskøbing') # transliterate('Ærøskøbing')
# # => "AEroskobing" # # => "AEroskobing"
...@@ -56,8 +57,12 @@ module Inflector ...@@ -56,8 +57,12 @@ module Inflector
# #
# transliterate('Jürgen', locale: :de) # transliterate('Jürgen', locale: :de)
# # => "Juergen" # # => "Juergen"
#
# This method requires that `string` be UTF-8 encoded. Passing an argument
# with a different string encoding will raise an ArgumentError.
def transliterate(string, replacement = "?", locale: nil) def transliterate(string, replacement = "?", locale: nil)
raise ArgumentError, "Can only transliterate strings. Received #{string.class.name}" unless string.is_a?(String) raise ArgumentError, "Can only transliterate strings. Received #{string.class.name}" unless string.is_a?(String)
raise ArgumentError, "Can only transliterate UTF-8 strings. Received string with encoding #{string.encoding}" unless string.encoding == ::Encoding::UTF_8
I18n.transliterate( I18n.transliterate(
ActiveSupport::Multibyte::Unicode.tidy_bytes(string).unicode_normalize(:nfc), ActiveSupport::Multibyte::Unicode.tidy_bytes(string).unicode_normalize(:nfc),
......
...@@ -57,4 +57,12 @@ def test_transliterate_handles_unknown_object ...@@ -57,4 +57,12 @@ def test_transliterate_handles_unknown_object
end end
assert_equal "Can only transliterate strings. Received Object", exception.message assert_equal "Can only transliterate strings. Received Object", exception.message
end end
def test_transliterate_handles_non_unicode_strings
ascii_8bit_string = "A".b
exception = assert_raises ArgumentError do
assert_equal "A", ActiveSupport::Inflector.transliterate(ascii_8bit_string)
end
assert_equal "Can only transliterate UTF-8 strings. Received string with encoding ASCII-8BIT", exception.message
end
end end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册