summaryrefslogtreecommitdiff
path: root/jni/ruby/lib/rexml/encoding.rb
diff options
context:
space:
mode:
Diffstat (limited to 'jni/ruby/lib/rexml/encoding.rb')
-rw-r--r--jni/ruby/lib/rexml/encoding.rb50
1 files changed, 50 insertions, 0 deletions
diff --git a/jni/ruby/lib/rexml/encoding.rb b/jni/ruby/lib/rexml/encoding.rb
new file mode 100644
index 0000000..1c7e79a
--- /dev/null
+++ b/jni/ruby/lib/rexml/encoding.rb
@@ -0,0 +1,50 @@
+# coding: US-ASCII
+module REXML
+ module Encoding
+ # ID ---> Encoding name
+ attr_reader :encoding
+ def encoding=(encoding)
+ encoding = encoding.name if encoding.is_a?(Encoding)
+ if encoding.is_a?(String)
+ original_encoding = encoding
+ encoding = find_encoding(encoding)
+ unless encoding
+ raise ArgumentError, "Bad encoding name #{original_encoding}"
+ end
+ end
+ return false if defined?(@encoding) and encoding == @encoding
+ if encoding
+ @encoding = encoding.upcase
+ else
+ @encoding = 'UTF-8'
+ end
+ true
+ end
+
+ def encode(string)
+ string.encode(@encoding)
+ end
+
+ def decode(string)
+ string.encode(::Encoding::UTF_8, @encoding)
+ end
+
+ private
+ def find_encoding(name)
+ case name
+ when /\Ashift-jis\z/i
+ return "SHIFT_JIS"
+ when /\ACP-(\d+)\z/
+ name = "CP#{$1}"
+ when /\AUTF-8\z/i
+ return name
+ end
+ begin
+ ::Encoding::Converter.search_convpath(name, 'UTF-8')
+ rescue ::Encoding::ConverterNotFoundError
+ return nil
+ end
+ name
+ end
+ end
+end