Index: subversion/bindings/swig/ruby/svn/client.rb
===================================================================
--- subversion/bindings/swig/ruby/svn/client.rb	(revision 23310)
+++ subversion/bindings/swig/ruby/svn/client.rb	(working copy)
@@ -268,7 +268,7 @@
         Client.cat2(output, path, peg_rev, rev, self)
         if used_string_io
           output.rewind
-          output.read
+          output.textmode_read
         else
           output
         end
Index: subversion/bindings/swig/ruby/svn/core.rb
===================================================================
--- subversion/bindings/swig/ruby/svn/core.rb	(revision 23310)
+++ subversion/bindings/swig/ruby/svn/core.rb	(working copy)
@@ -5,6 +5,18 @@
 require "svn/util"
 require "svn/ext/core"
 
+class StringIO
+  if /cygwin|mingw|mswin32|bccwin32/.match(RUBY_PLATFORM)
+    def textmode_read( *a )
+      result = read( *a )
+      result.gsub(/\r\n/, "\n") if result.respond_to? :gsub
+    end
+  else
+    alias :textmode_read :read
+  end
+end
+
+
 class Time
   MILLION = 1000000
 
@@ -237,7 +249,7 @@
         ]
         Core.diff_file_output_unified2(*args)
         output.rewind
-        output.read
+        output.textmode_read
       end
 
       def merge(conflict_original=nil, conflict_modified=nil,
@@ -255,7 +267,7 @@
         ]
         Core.diff_file_output_merge(*args)
         output.rewind
-        output.read
+        output.textmode_read
       end
 
       def conflict?
