Active Support 多字节字符
Chars
使您能够在 Ruby String
类中透明地处理 UTF-8 编码,而无需深入了解编码知识。一个 Chars
对象在初始化时接受一个字符串,并以编码安全的方式代理 String
方法。所有正常的 String
方法也都在代理上实现。
String
方法通过 Chars
对象进行代理,可以通过 mb_chars
方法访问。通常返回 String
对象的方法现在返回 Chars
对象,因此可以对方法进行链式调用。
'The Perfect String '.mb_chars.downcase.strip
# => #<ActiveSupport::Multibyte::Chars:0x007fdc434ccc10 @wrapped_string="the perfect string">
只要不进行显式类检查,Chars
对象就可以与 String
对象完全互换。如果某些方法确实显式检查类,请在将 chars 对象传递给它们之前调用 to_s
。
bad.explicit_checking_method 'T'.mb_chars.downcase.to_s
默认的 Chars
实现假设字符串的编码为 UTF-8,如果您想处理不同的编码,可以编写自己的多字节字符串处理程序,并通过 ActiveSupport::Multibyte.proxy_class
进行配置。
class CharsForUTF32
def size
@wrapped_string.size / 4
end
def self.accepts?(string)
string.length % 4 == 0
end
end
ActiveSupport::Multibyte.proxy_class = CharsForUTF32
- C
- D
- G
- L
- M
- N
- R
- S
- T
- Comparable
属性
[R] | to_s | |
[R] | to_str | |
[R] | wrapped_string |
类公共方法
new(string) 链接
通过包装 string 创建一个新的 Chars
实例。
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/multibyte/chars.rb, line 56 def initialize(string) @wrapped_string = string @wrapped_string.force_encoding(Encoding::UTF_8) unless @wrapped_string.frozen? end
实例公共方法
compose() 链接
对所有字符执行组合操作。
'é'.length # => 1
'é'.mb_chars.compose.to_s.length # => 1
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/multibyte/chars.rb, line 140 def compose chars(Unicode.compose(@wrapped_string.codepoints.to_a).pack("U*")) end
decompose() 链接
对所有字符执行规范分解。
'é'.length # => 1
'é'.mb_chars.decompose.to_s.length # => 2
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/multibyte/chars.rb, line 132 def decompose chars(Unicode.decompose(:canonical, @wrapped_string.codepoints.to_a).pack("U*")) end
grapheme_length() 链接
返回字符串中字素簇的数量。
'क्षि'.mb_chars.length # => 4
'क्षि'.mb_chars.grapheme_length # => 2
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/multibyte/chars.rb, line 148 def grapheme_length @wrapped_string.grapheme_clusters.length end
limit(limit) 链接
将字符串的字节大小限制为一定数量的字节,而不会破坏字符。当由于某种原因字符串存储空间有限时可以使用。
'こんにちは'.mb_chars.limit(7).to_s # => "こん"
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/multibyte/chars.rb, line 115 def limit(limit) chars(@wrapped_string.truncate_bytes(limit, omission: nil)) end
method_missing(method, ...) 链接
将所有未定义的方法转发到包装的字符串。
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/multibyte/chars.rb, line 62 def method_missing(method, ...) result = @wrapped_string.__send__(method, ...) if method.end_with?("!") self if result else result.kind_of?(String) ? chars(result) : result end end
respond_to_missing?(method, include_private) 链接
如果 obj 响应给定方法,则返回 true
。只有当可选的第二个参数评估为 true
时,私有方法才会包含在搜索中。
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/multibyte/chars.rb, line 74 def respond_to_missing?(method, include_private) @wrapped_string.respond_to?(method, include_private) end
reverse() 链接
反转字符串中的所有字符。
'Café'.mb_chars.reverse.to_s # => 'éfaC'
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/multibyte/chars.rb, line 106 def reverse chars(@wrapped_string.grapheme_clusters.reverse.join) end
slice!(*args) 链接
类似于 String#slice!
,但返回一个 Chars
实例,如果字符串未被修改,则返回 nil
。如果给定的范围超出边界,字符串将不会被修改。
string = 'Welcome'
string.mb_chars.slice!(3) # => #<ActiveSupport::Multibyte::Chars:0x000000038109b8 @wrapped_string="c">
string # => 'Welome'
string.mb_chars.slice!(0..3) # => #<ActiveSupport::Multibyte::Chars:0x00000002eb80a0 @wrapped_string="Welo">
string # => 'me'
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/multibyte/chars.rb, line 96 def slice!(*args) string_sliced = @wrapped_string.slice!(*args) if string_sliced chars(string_sliced) end end
split(*args) 链接
与 String#split
的工作方式相同,区别在于结果列表中的项目是 Chars
实例,而不是 String
。这使得链式调用方法更加容易。
'Café périferôl'.mb_chars.split(/é/).map { |part| part.upcase.to_s } # => ["CAF", " P", "RIFERÔL"]
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/multibyte/chars.rb, line 83 def split(*args) @wrapped_string.split(*args).map { |i| self.class.new(i) } end
tidy_bytes(force = false) 链接
用其 UTF-8 等效项替换所有 ISO-8859-1 或 CP1252 字符,从而生成一个有效的 UTF-8 字符串。
传递 true
将强制整理所有字节,假设字符串的编码完全是 CP1252 或 ISO-8859-1。
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/multibyte/chars.rb, line 157 def tidy_bytes(force = false) chars(Unicode.tidy_bytes(@wrapped_string, force)) end
titleize() 链接
尽可能将每个单词的第一个字母大写。
"ÉL QUE SE ENTERÓ".mb_chars.titleize.to_s # => "Él Que Se Enteró"
"日本語".mb_chars.titleize.to_s # => "日本語"
源代码: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/multibyte/chars.rb, line 123 def titleize chars(downcase.to_s.gsub(/\b('?\S)/u) { $1.upcase }) end