public static MutableString EncodeInPlace( ConversionStorage<IDictionary<object, object>>/*!*/ toHash, ConversionStorage<MutableString>/*!*/ toStr, MutableString/*!*/ self, [Optional]object toEncoding, [Optional]object fromEncoding, [DefaultParameterValue(null), DefaultProtocol]IDictionary<object, object> options) { Protocols.TryConvertToOptions(toHash, ref options, ref toEncoding, ref fromEncoding); // encodings: RubyEncoding to, from; MutableString toEncodingName = null, fromEncodingName = null; if (toEncoding == Missing.Value) { to = toStr.Context.DefaultInternalEncoding; if (to == null) { return self; } } else { to = toEncoding as RubyEncoding; if (to == null) { toEncodingName = Protocols.CastToString(toStr, toEncoding); } } if (fromEncoding == Missing.Value) { from = self.Encoding; } else { from = fromEncoding as RubyEncoding; if (from == null) { fromEncodingName = Protocols.CastToString(toStr, fromEncoding); } } try { if (fromEncodingName != null) { from = toStr.Context.GetRubyEncoding(fromEncodingName); } if (toEncodingName != null) { to = toStr.Context.GetRubyEncoding(toEncodingName); } } catch (ArgumentException) { throw new ConverterNotFoundError(RubyExceptions.FormatMessage("code converter not found ({0} to {1})", (fromEncodingName != null) ? fromEncodingName.ToAsciiString() : from.Name, (toEncodingName != null) ? toEncodingName.ToAsciiString() : to.Name )); } self.RequireNotFrozen(); // options: // TODO: options // :invalid => :replace // :undef => :replace, :replace => "" // :xml => :text // :xml => :attr self.Transcode(from, to); return self; }