模块 Net::IMAP::StringPrep
用于实现 stringprep 配置文件的正则表达式和实用方法。StringPrep 算法在 RFC-3454 中定义。RFC-3454 附录中定义的每个码位表都与此模块中定义的正则表达式匹配。
公共类方法
返回与给定 table
名称匹配的正则表达式。
# File net-imap-0.5.4/lib/net/imap/stringprep.rb, line 49 def self.[](table) Tables::REGEXPS.fetch(table) end
公共实例方法
检查 string
是否遵守 RFC-3454, §6 中所有 “双向字符” 的要求
-
StringPrep["C.8"] 中的字符必须被禁止
-
如果字符串包含任何 RandALCat 字符,则该字符串不能包含任何 LCat 字符。
-
如果字符串包含任何 RandALCat 字符,则 RandALCat 字符必须是字符串的第一个字符,并且 RandALCat 字符必须是字符串的最后一个字符。
这通常与 check_prohibited!
结合使用,因此仅当 c_8: true
时才会检查表 “C.8”。
除非满足所有要求,否则会引发 ProhibitedCodepoint
或 BidiStringError
。 profile
是一个可选字符串,它将被添加到任何引发的异常中(它不会影响行为)。
# File net-imap-0.5.4/lib/net/imap/stringprep.rb, line 144 def check_bidi!(string, c_8: false, profile: nil) check_prohibited!(string, "C.8", profile: profile) if c_8 if Tables::BIDI_FAILS_REQ2.match?(string) raise BidiStringError.new( Tables::BIDI_DESC_REQ2, string: string, profile: profile, ) elsif Tables::BIDI_FAILS_REQ3.match?(string) raise BidiStringError.new( Tables::BIDI_DESC_REQ3, string: string, profile: profile, ) end end
检查 string
中是否存在 tables
中的任何码位。引发一个 ProhibitedCodepoint
,描述第一个匹配的表。
当 bidi: true
时,还会检查双向字符,这可能会引发 BidiStringError
。
profile
是一个可选字符串,它将被添加到任何引发的异常中(它不会影响行为)。
# File net-imap-0.5.4/lib/net/imap/stringprep.rb, line 104 def check_prohibited!(string, *tables, bidi: false, unassigned: "A.1", stored: false, profile: nil) tables = Tables::TITLES.keys.grep(/^C/) if tables.empty? tables |= [unassigned] if stored tables |= %w[C.8] if bidi table = tables.find {|t| case t when String then Tables::REGEXPS.fetch(t).match?(string) when Regexp then t.match?(string) else raise ArgumentError, "only table names and regexps can be checked" end } if table raise ProhibitedCodepoint.new( table, string: string, profile: profile ) end check_bidi!(string, profile: profile) if bidi end
# File net-imap-0.5.4/lib/net/imap/stringprep.rb, line 88 def map_tables!(string, *tables) tables.each do |table| regexp, replacements = Tables::MAPPINGS.fetch(table) string.gsub!(regexp, replacements) end string end
映射 – 对于输入中的每个字符,检查它是否有映射,如果有,则将其替换为其映射。这在第 3 节中描述。
规范化 – 可能使用 Unicode 规范化来规范化步骤 1 的结果。这在第 4 节中描述。
禁止 – 检查输出中是否不允许任何字符。如果找到任何不允许的字符,则返回错误。这在第 5 节中描述。
检查 bidi – 可能检查从右到左的字符,如果找到任何此类字符,请确保整个字符串满足双向字符串的要求。如果该字符串不满足双向字符串的要求,则返回错误。这在第 6 节中描述。
必须按照给定的顺序执行上述步骤,以符合本规范。
# File net-imap-0.5.4/lib/net/imap/stringprep.rb, line 76 def stringprep(string, maps:, normalization:, prohibited:, **opts) string = string.encode("UTF-8") # also dups (and raises invalid encoding) map_tables!(string, *maps) if maps string.unicode_normalize!(normalization) if normalization check_prohibited!(string, *prohibited, **opts) if prohibited string end