1 // -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
3 // System.Text.Encoding.cs
6 // Sean MacIsaac (macisaac@ximian.com)
7 // Dietmar Maurer (dietmar@ximian.com)
9 // (C) Ximian, Inc. http://www.ximian.com
12 using System.Runtime.CompilerServices;
14 namespace System.Text {
16 public abstract class Encoding {
17 private static ASCIIEncoding ascii_encoding;
18 private static UnicodeEncoding big_endian_unicode;
19 private static UnicodeEncoding unicode_encoding;
20 private static UTF7Encoding utf7_encoding;
21 private static UTF8Encoding utf8_encoding;
25 protected string body_name;
26 protected string encoding_name;
27 protected string header_name;
28 protected string web_name;
30 protected bool is_browser_display = false;
31 protected bool is_browser_save = false;
32 protected bool is_mail_news_display = false;
33 protected bool is_mail_news_save = false;
35 private Encoder default_encoder = null;
36 private Decoder default_decoder = null;
39 private string iconv_name;
40 private bool big_endian;
41 private Encoder iconv_encoder = null;
42 private Decoder iconv_decoder = null;
48 protected Encoding (int codepage)
50 this.codepage = codepage;
53 internal protected Encoding (string name, bool big_endian)
55 this.iconv_name = name;
56 this.big_endian = big_endian;
58 iconv_decoder = new IConvDecoder (iconv_name, big_endian);
59 iconv_encoder = new IConvEncoder (iconv_name, big_endian);
62 public static Encoding Unicode {
64 if (unicode_encoding == null) {
65 unicode_encoding = new UnicodeEncoding();
67 return unicode_encoding;
71 public static Encoding UTF7 {
73 if (utf7_encoding == null) {
74 utf7_encoding = new UTF7Encoding();
80 public static Encoding UTF8 {
82 if (utf8_encoding == null) {
83 utf8_encoding = new UTF8Encoding();
89 public static Encoding ASCII {
91 if (ascii_encoding == null)
92 ascii_encoding = new ASCIIEncoding ();
93 return ascii_encoding;
97 public static Encoding BigEndianUnicode {
99 if (big_endian_unicode == null)
100 big_endian_unicode = new UnicodeEncoding (true, true);
101 return big_endian_unicode;
105 public virtual string BodyName {
111 public virtual int CodePage {
117 public static Encoding Default {
123 public virtual string EncodingName {
125 return encoding_name;
129 public virtual string HeaderName {
135 public virtual bool IsBrowserDisplay {
137 return is_browser_display;
141 public virtual bool IsBrowserSave {
143 return is_browser_save;
147 public virtual bool IsMailNewsDisplay {
149 return is_mail_news_display;
153 public virtual bool IsMailNewsSave {
155 return is_mail_news_save;
159 public virtual string WebName {
166 public virtual int WindowsCodePage {
173 public static byte[] Convert(Encoding srcEncoding, Encoding dstEncoding, byte[] bytes)
175 return dstEncoding.GetBytes (srcEncoding.GetChars (bytes));
178 public static byte[] Convert(Encoding srcEncoding, Encoding dstEncoding,
179 byte[] bytes, int index, int count)
181 return dstEncoding.GetBytes (srcEncoding.GetChars (bytes, index, count));
184 public override bool Equals (object value)
186 if (!(value is Encoding))
189 Encoding e = (Encoding) value;
191 if (e.codepage != codepage)
194 if (e.body_name != body_name)
197 if (e.encoding_name != encoding_name)
200 if (e.header_name != header_name)
206 public virtual int GetByteCount (char[] chars)
208 return GetByteCount (chars, 0, chars.Length);
211 public virtual int GetByteCount (string s)
213 char [] chars = s.ToCharArray ();
215 return GetByteCount (chars, 0, chars.Length);
218 public virtual int GetByteCount (char[] chars, int index, int count)
220 return iconv_encoder.GetByteCount (chars, index, count, false);
223 public virtual byte[] GetBytes(char[] chars)
225 return GetBytes (chars, 0, chars.Length);
228 public virtual byte[] GetBytes(string s)
230 char [] chars = s.ToCharArray ();
231 return GetBytes (chars, 0, chars.Length);
234 public virtual byte[] GetBytes(char[] chars, int index, int count)
236 int bc = GetMaxByteCount (count - index);
237 byte [] bytes = new byte [bc];
239 int len = GetBytes (chars, index, count, bytes, 0);
240 byte [] res = new byte [len];
242 Array.Copy (bytes, res, len);
247 public int GetBytes (char[] chars, int charIndex, int charCount,
248 byte[] bytes, int byteIndex)
250 return iconv_encoder.GetBytes (chars, charIndex, charCount, bytes, byteIndex, true);
253 public virtual int GetBytes(string s, int charIndex, int charCount,
254 byte[] bytes, int byteIndex)
256 return GetBytes (s.ToCharArray (), charIndex, charCount, bytes, byteIndex);
259 public virtual int GetCharCount (byte[] bytes)
261 return GetCharCount (bytes, 0, bytes.Length);
264 public virtual int GetCharCount (byte[] bytes, int index, int count)
266 return iconv_decoder.GetCharCount (bytes, index, count);
269 public virtual char[] GetChars (byte[] bytes)
271 return GetChars (bytes, 0, bytes.Length);
274 public virtual char[] GetChars (byte[] bytes, int index, int count)
276 int cc = GetMaxCharCount (count - index);
277 char [] chars = new char [cc];
279 int len = GetChars (bytes, index, count, chars, 0);
280 char [] res = new char [len];
282 Array.Copy (chars, res, len);
287 public virtual int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex)
289 return iconv_decoder.GetChars (bytes, byteIndex, byteCount, chars, charIndex);
292 public virtual Decoder GetDecoder()
294 if (iconv_name != null)
295 return new IConvDecoder (iconv_name, big_endian);
297 if (default_decoder == null)
298 default_decoder = new DefaultDecoder (this);
300 return default_decoder;
303 public virtual Encoder GetEncoder()
305 if (iconv_name != null)
306 return new IConvEncoder (iconv_name, big_endian);
308 if (default_encoder == null)
309 default_encoder = new DefaultEncoder (this);
311 return default_encoder;
315 public virtual Encoding GetEncoding (int codepage)
322 public virtual Encoding GetEncoding (string name)
329 public override int GetHashCode()
335 public abstract int GetMaxByteCount (int charCount);
337 public abstract int GetMaxCharCount (int byteCount);
340 public virtual byte[] GetPreamble()
346 public virtual string GetString(byte[] bytes)
348 return GetString (bytes, 0, bytes.Length);
351 public virtual string GetString(byte[] bytes, int index, int count)
353 char [] chars = GetChars (bytes, index, count);
355 return chars.ToString ();
358 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
359 internal extern static IntPtr IConvNewEncoder (string name, bool big_endian);
361 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
362 internal extern static IntPtr IConvNewDecoder (string name, bool big_endian);
364 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
365 internal extern static void IConvReset (IntPtr converter);
367 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
368 internal extern static int IConvGetByteCount (IntPtr converter, char[] chars,
369 int index, int count);
371 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
372 internal extern static int IConvGetBytes (IntPtr converter, char[] chars, int charIndex,
373 int charCount, byte[] bytes, int byteIndex);
375 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
376 internal extern static int IConvGetCharCount (IntPtr converter, byte[] bytes,
377 int index, int count);
379 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
380 internal extern static int IConvGetChars (IntPtr converter, byte[] bytes, int byteIndex,
381 int byteCount, char[] chars, int charIndex);