AVRO-3180: Interop tests fail on force_encoding (#1296)

diff --git a/lang/ruby/lib/avro/ipc.rb b/lang/ruby/lib/avro/ipc.rb
index 67eb10d..72520a5 100644
--- a/lang/ruby/lib/avro/ipc.rb
+++ b/lang/ruby/lib/avro/ipc.rb
@@ -104,7 +104,7 @@
     def request(message_name, request_datum)
       # Writes a request message and reads a response or error message.
       # build handshake and call request
-      buffer_writer = StringIO.new(''.force_encoding('BINARY'))
+      buffer_writer = StringIO.new(String.new('', encoding: 'BINARY'))
       buffer_encoder = Avro::IO::BinaryEncoder.new(buffer_writer)
       write_handshake_request(buffer_encoder)
       write_call_request(message_name, request_datum, buffer_encoder)
@@ -248,7 +248,7 @@
     # a response or error. Compare to 'handle()' in Thrift.
     def respond(call_request, transport=nil)
       buffer_decoder = Avro::IO::BinaryDecoder.new(StringIO.new(call_request))
-      buffer_writer = StringIO.new(''.force_encoding('BINARY'))
+      buffer_writer = StringIO.new(String.new('', encoding: 'BINARY'))
       buffer_encoder = Avro::IO::BinaryEncoder.new(buffer_writer)
       error = nil
       response_metadata = {}
@@ -510,7 +510,7 @@
     def read_framed_message
       message = []
       loop do
-        buffer = ''.force_encoding('BINARY')
+        buffer = String.new('', encoding: 'BINARY')
         buffer_size = read_buffer_size
 
         return message.join if buffer_size == 0
@@ -546,7 +546,7 @@
     end
 
     def transceive(message)
-      writer = FramedWriter.new(StringIO.new(''.force_encoding('BINARY')))
+      writer = FramedWriter.new(StringIO.new(String.new('', encoding: 'BINARY')))
       writer.write_framed_message(message)
       resp = @conn.post('/', writer.to_s, {'Content-Type' => 'avro/binary'})
       FramedReader.new(StringIO.new(resp.body)).read_framed_message