Back-ported contributed changes to Japanese encodings
M src/rexml/encoding.rb +58 -58
@@ 1,64 1,64 @@ 
 # -*- mode: ruby; ruby-indent-level: 2; indent-tabs-mode: t; tab-width: 2 -*- vim: sw=2 ts=2
 module REXML
-	module Encoding
-               @encoding_methods = {}
-               def self.register(enc, &block)
-                       @encoding_methods[enc] = block
-               end
-               def self.apply(obj, enc)
-                       @encoding_methods[enc][obj]
-               end
-               def self.encoding_method(enc)
-                       @encoding_methods[enc]
-               end
+  module Encoding
+    @encoding_methods = {}
+    def self.register(enc, &block)
+      @encoding_methods[enc] = block
+    end
+    def self.apply(obj, enc)
+      @encoding_methods[enc][obj]
+    end
+    def self.encoding_method(enc)
+      @encoding_methods[enc]
+    end
 
-		# Native, default format is UTF-8, so it is declared here rather than in
-		# an encodings/ definition.
-		UTF_8 = 'UTF-8'
-		UTF_16 = 'UTF-16'
-		UNILE = 'UNILE'
+    # Native, default format is UTF-8, so it is declared here rather than in
+    # an encodings/ definition.
+    UTF_8 = 'UTF-8'
+    UTF_16 = 'UTF-16'
+    UNILE = 'UNILE'
 
-		# ID ---> Encoding name
-		attr_reader :encoding
-		def encoding=( enc )
-			old_verbosity = $VERBOSE
-			begin
-				$VERBOSE = false
-				return if defined? @encoding and enc == @encoding
-				if enc and enc != UTF_8
-					@encoding = enc.upcase
-					begin
-                                               require 'rexml/encodings/ICONV.rb'
-                                               Encoding.apply(self, "ICONV")
-					rescue LoadError, Exception => err
-                                               raise ArgumentError, "Bad encoding name #@encoding" unless @encoding =~ /^[\w-]+$/
-						@encoding.untaint 
-						enc_file = File.join( "rexml", "encodings", "#@encoding.rb" )
-						begin
-                                                       require enc_file
-                                                       Encoding.apply(self, @encoding)
-						rescue LoadError
-                                                       puts $!.message
-                                                       raise ArgumentError, "No decoder found for encoding #@encoding.  Please install iconv."
-						end
-					end
-				else
-                                       @encoding = UTF_8
-                                       require 'rexml/encodings/UTF-8.rb'
-                                       Encoding.apply(self, @encoding)
-				end
-			ensure
-				$VERBOSE = old_verbosity
-			end
-		end
+    # ID ---> Encoding name
+    attr_reader :encoding
+    def encoding=( enc )
+      old_verbosity = $VERBOSE
+      begin
+        $VERBOSE = false
+        return if defined? @encoding and enc == @encoding
+        if enc and enc != UTF_8
+          @encoding = enc.upcase
+          begin
+            require 'rexml/encodings/ICONV.rb'
+            Encoding.apply(self, "ICONV")
+          rescue LoadError, Exception => err
+            raise ArgumentError, "Bad encoding name #@encoding" unless @encoding =~ /^[\w-]+$/
+            @encoding.untaint 
+            enc_file = File.join( "rexml", "encodings", "#@encoding.rb" )
+            begin
+              require enc_file
+              Encoding.apply(self, @encoding)
+            rescue LoadError
+              puts $!.message
+              raise ArgumentError, "No decoder found for encoding #@encoding.  Please install iconv."
+            end
+          end
+        else
+          @encoding = UTF_8
+          require 'rexml/encodings/UTF-8.rb'
+          Encoding.apply(self, @encoding)
+        end
+      ensure
+        $VERBOSE = old_verbosity
+      end
+    end
 
-		def check_encoding str
-			# We have to recognize UTF-16, LSB UTF-16, and UTF-8
-			return UTF_16 if str[0] == 254 && str[1] == 255
-			return UNILE if str[0] == 255 && str[1] == 254
-			str =~ /^\s*<?xml\s*version=(['"]).*?\2\s*encoding=(["'])(.*?)\2/um
-			return $1.upcase if $1
-			return UTF_8
-		end
-	end
+    def check_encoding str
+      # We have to recognize UTF-16, LSB UTF-16, and UTF-8
+      return UTF_16 if str[0] == 254 && str[1] == 255
+      return UNILE if str[0] == 255 && str[1] == 254
+      str =~ /^\s*<?xml\s*version=(['"]).*?\2\s*encoding=(["'])(.*?)\2/um
+      return $1.upcase if $1
+      return UTF_8
+    end
+  end
 end

          
M src/rexml/encodings/EUC-JP.rb +22 -7
@@ 1,13 1,28 @@ 
-require 'uconv'
-
 module REXML
   module Encoding
-    def decode_eucjp(str)
-      Uconv::euctou8(str)
-    end
+    begin
+      require 'uconv'
+
+      def decode_eucjp(str)
+        Uconv::euctou8(str)
+      end
 
-    def encode_eucjp content
-      Uconv::u8toeuc(content)
+      def encode_eucjp content
+        Uconv::u8toeuc(content)
+      end
+    rescue LoadError
+      require 'nkf'
+
+      EUCTOU8 = '-Ewm0'
+      U8TOEUC = '-Wem0'
+
+      def decode_eucjp(str)
+        NKF.nkf(EUCTOU8, str)
+      end
+
+      def encode_eucjp content
+        NKF.nkf(U8TOEUC, content)
+      end
     end
 
     register("EUC-JP") do |obj|

          
M src/rexml/encodings/SHIFT-JIS.rb +22 -7
@@ 1,13 1,28 @@ 
-require 'uconv'
-
 module REXML
   module Encoding
-    def decode_sjis content
-      Uconv::u8tosjis(content)
-    end
+    begin
+      require 'uconv'
+
+      def decode_sjis content
+        Uconv::sjistou8(content)
+      end
 
-    def encode_sjis(str)
-      Uconv::sjistou8(str)
+      def encode_sjis(str)
+        Uconv::u8tosjis(str)
+      end
+    rescue LoadError
+      require 'nkf'
+
+      SJISTOU8 = '-Swm0'
+      U8TOSJIS = '-Wsm0'
+
+      def decode_sjis(str)
+        NKF.nkf(SJISTOU8, str)
+      end
+
+      def encode_sjis content
+        NKF.nkf(U8TOSJIS, content)
+      end
     end
 
     b = proc do |obj|

          
M src/rexml/encodings/SHIFT_JIS.rb +1 -1
@@ 1,1 1,1 @@ 
-load 'rexml/encodings/SHIFT-JIS.rb'
+require 'rexml/encodings/SHIFT-JIS'