模块 RDoc::Encoding
公共类方法
change_encoding(text, encoding) 点击切换源
根据 encoding
更改编码,无需转换并返回新字符串
# File rdoc/encoding.rb, line 112 def self.change_encoding text, encoding if text.kind_of? RDoc::Comment text.encode! encoding else String.new text, encoding: encoding end end
detect_encoding(string) 点击切换源
根据魔术注释检测 string
的编码
# File rdoc/encoding.rb, line 92 def self.detect_encoding string result = HEADER_REGEXP.match string name = result && result[:name] name ? Encoding.find(name) : nil end
read_file(filename, encoding, force_transcode = false) 点击切换源
读取 filename
的内容并处理文件中的任何编码指令。
内容将被转换为 encoding
。如果文件无法转换,将打印警告并返回 nil。
如果 force_transcode
为 true,则文档将被转码,并且目标编码中的任何未知字符都将被替换为“?”
# File rdoc/encoding.rb, line 32 def self.read_file filename, encoding, force_transcode = false content = File.open filename, "rb" do |f| f.read end content.gsub!("\r\n", "\n") if RUBY_PLATFORM =~ /mswin|mingw/ utf8 = content.sub!(/\A\xef\xbb\xbf/, '') enc = RDoc::Encoding.detect_encoding content content = RDoc::Encoding.change_encoding content, enc if enc begin encoding ||= Encoding.default_external orig_encoding = content.encoding if not orig_encoding.ascii_compatible? then content = content.encode encoding elsif utf8 then content = RDoc::Encoding.change_encoding content, Encoding::UTF_8 content = content.encode encoding else # assume the content is in our output encoding content = RDoc::Encoding.change_encoding content, encoding end unless content.valid_encoding? then # revert and try to transcode content = RDoc::Encoding.change_encoding content, orig_encoding content = content.encode encoding end unless content.valid_encoding? then warn "unable to convert #{filename} to #{encoding}, skipping" content = nil end rescue Encoding::InvalidByteSequenceError, Encoding::UndefinedConversionError => e if force_transcode then content = RDoc::Encoding.change_encoding content, orig_encoding content = content.encode(encoding, :invalid => :replace, :undef => :replace, :replace => '?') return content else warn "unable to convert #{e.message} for #{filename}, skipping" return nil end end content rescue ArgumentError => e raise unless e.message =~ /unknown encoding name - (.*)/ warn "unknown encoding name \"#{$1}\" for #{filename}, skipping" nil rescue Errno::EISDIR, Errno::ENOENT nil end
remove_magic_comment(string) 点击切换源
删除魔术注释和 shebang
# File rdoc/encoding.rb, line 102 def self.remove_magic_comment string string.sub HEADER_REGEXP do |s| s.gsub(/[^\n]/, '') end end