1# coding: US-ASCII 2module REXML 3 module Encoding 4 # ID ---> Encoding name 5 attr_reader :encoding 6 def encoding=(encoding) 7 encoding = encoding.name if encoding.is_a?(Encoding) 8 if encoding.is_a?(String) 9 original_encoding = encoding 10 encoding = find_encoding(encoding) 11 unless encoding 12 raise ArgumentError, "Bad encoding name #{original_encoding}" 13 end 14 end 15 return false if defined?(@encoding) and encoding == @encoding 16 if encoding 17 @encoding = encoding.upcase 18 else 19 @encoding = 'UTF-8' 20 end 21 true 22 end 23 24 def encode(string) 25 string.encode(@encoding) 26 end 27 28 def decode(string) 29 string.encode(::Encoding::UTF_8, @encoding) 30 end 31 32 private 33 def find_encoding(name) 34 case name 35 when /\Ashift-jis\z/i 36 return "SHIFT_JIS" 37 when /\ACP-(\d+)\z/ 38 name = "CP#{$1}" 39 when /\AUTF-8\z/i 40 return name 41 end 42 begin 43 ::Encoding::Converter.search_convpath(name, 'UTF-8') 44 rescue ::Encoding::ConverterNotFoundError 45 return nil 46 end 47 name 48 end 49 end 50end 51