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 {
17 public abstract class Encoding {
18 private static ASCIIEncoding ascii_encoding;
19 private static UnicodeEncoding big_endian_unicode;
20 private static UnicodeEncoding unicode_encoding;
21 private static UTF7Encoding utf7_encoding;
22 private static UTF8Encoding utf8_encoding;
26 protected string body_name;
27 protected string encoding_name;
28 protected string header_name;
29 protected string web_name;
31 protected bool is_browser_display = false;
32 protected bool is_browser_save = false;
33 protected bool is_mail_news_display = false;
34 protected bool is_mail_news_save = false;
36 private Encoder default_encoder = null;
37 private Decoder default_decoder = null;
40 private string iconv_name;
41 private bool big_endian;
42 private Encoder iconv_encoder = null;
43 private Decoder iconv_decoder = null;
49 protected Encoding (int codepage)
51 this.codepage = codepage;
54 internal protected Encoding (string name, bool big_endian)
56 this.iconv_name = name;
57 this.big_endian = big_endian;
59 iconv_decoder = new IConvDecoder (iconv_name, big_endian);
60 iconv_encoder = new IConvEncoder (iconv_name, big_endian);
63 public static Encoding Unicode {
65 if (unicode_encoding == null) {
66 unicode_encoding = new UnicodeEncoding();
68 return unicode_encoding;
72 public static Encoding UTF7 {
74 if (utf7_encoding == null) {
75 utf7_encoding = new UTF7Encoding();
81 public static Encoding UTF8 {
83 if (utf8_encoding == null) {
84 utf8_encoding = new UTF8Encoding();
90 public static Encoding ASCII {
92 if (ascii_encoding == null)
93 ascii_encoding = new ASCIIEncoding ();
94 return ascii_encoding;
98 public static Encoding BigEndianUnicode {
100 if (big_endian_unicode == null)
101 big_endian_unicode = new UnicodeEncoding (true, true);
102 return big_endian_unicode;
106 public virtual string BodyName {
112 public virtual int CodePage {
118 public static Encoding Default {
124 public virtual string EncodingName {
126 return encoding_name;
130 public virtual string HeaderName {
136 public virtual bool IsBrowserDisplay {
138 return is_browser_display;
142 public virtual bool IsBrowserSave {
144 return is_browser_save;
148 public virtual bool IsMailNewsDisplay {
150 return is_mail_news_display;
154 public virtual bool IsMailNewsSave {
156 return is_mail_news_save;
160 public virtual string WebName {
167 public virtual int WindowsCodePage {
174 public static byte[] Convert(Encoding srcEncoding, Encoding dstEncoding, byte[] bytes)
176 return dstEncoding.GetBytes (srcEncoding.GetChars (bytes));
179 public static byte[] Convert(Encoding srcEncoding, Encoding dstEncoding,
180 byte[] bytes, int index, int count)
182 return dstEncoding.GetBytes (srcEncoding.GetChars (bytes, index, count));
185 public override bool Equals (object value)
187 if (!(value is Encoding))
190 Encoding e = (Encoding) value;
192 if (e.codepage != codepage)
195 if (e.body_name != body_name)
198 if (e.encoding_name != encoding_name)
201 if (e.header_name != header_name)
207 public virtual int GetByteCount (char[] chars)
209 return GetByteCount (chars, 0, chars.Length);
212 public virtual int GetByteCount (string s)
214 char [] chars = s.ToCharArray ();
216 return GetByteCount (chars, 0, chars.Length);
219 public virtual int GetByteCount (char[] chars, int index, int count)
221 return iconv_encoder.GetByteCount (chars, index, count, false);
224 public virtual byte[] GetBytes(char[] chars)
226 return GetBytes (chars, 0, chars.Length);
229 public virtual byte[] GetBytes(string s)
231 char [] chars = s.ToCharArray ();
232 return GetBytes (chars, 0, chars.Length);
235 public virtual byte[] GetBytes(char[] chars, int index, int count)
237 int bc = GetByteCount (chars, index, count);
238 byte [] bytes = new byte [bc];
240 int len = GetBytes (chars, index, count, bytes, 0);
241 byte [] res = new byte [len];
243 Array.Copy (bytes, res, len);
248 public virtual int GetBytes (char[] chars, int charIndex, int charCount,
249 byte[] bytes, int byteIndex)
251 return iconv_encoder.GetBytes (chars, charIndex, charCount, bytes, byteIndex, true);
254 public virtual int GetBytes(string s, int charIndex, int charCount,
255 byte[] bytes, int byteIndex)
257 return GetBytes (s.ToCharArray (), charIndex, charCount, bytes, byteIndex);
260 public virtual int GetCharCount (byte[] bytes)
262 return GetCharCount (bytes, 0, bytes.Length);
265 public virtual int GetCharCount (byte[] bytes, int index, int count)
267 return iconv_decoder.GetCharCount (bytes, index, count);
270 public virtual char[] GetChars (byte[] bytes)
272 return GetChars (bytes, 0, bytes.Length);
275 public virtual char[] GetChars (byte[] bytes, int index, int count)
277 int cc = GetMaxCharCount (count);
278 char [] chars = new char [cc];
280 int len = GetChars (bytes, index, count, chars, 0);
281 char [] res = new char [len];
283 Array.Copy (chars, res, len);
288 public virtual int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex)
290 return iconv_decoder.GetChars (bytes, byteIndex, byteCount, chars, charIndex);
293 public virtual Decoder GetDecoder()
295 if (iconv_name != null)
296 return new IConvDecoder (iconv_name, big_endian);
298 if (default_decoder == null)
299 default_decoder = new DefaultDecoder (this);
301 return default_decoder;
304 public virtual Encoder GetEncoder()
306 if (iconv_name != null)
307 return new IConvEncoder (iconv_name, big_endian);
309 if (default_encoder == null)
310 default_encoder = new DefaultEncoder (this);
312 return default_encoder;
316 public static Encoding GetEncoding (int codepage)
323 public static Encoding GetEncoding (string name)
330 public override int GetHashCode()
336 public abstract int GetMaxByteCount (int charCount);
338 public abstract int GetMaxCharCount (int byteCount);
341 public virtual byte[] GetPreamble()
347 public virtual string GetString(byte[] bytes)
349 return GetString (bytes, 0, bytes.Length);
352 public virtual string GetString(byte[] bytes, int index, int count)
354 char [] chars = GetChars (bytes, index, count);
356 return chars.ToString ();
359 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
360 internal extern static IntPtr IConvNewEncoder (string name, bool big_endian);
362 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
363 internal extern static IntPtr IConvNewDecoder (string name, bool big_endian);
365 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
366 internal extern static void IConvReset (IntPtr converter);
368 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
369 internal extern static int IConvGetByteCount (IntPtr converter, char[] chars,
370 int index, int count);
372 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
373 internal extern static int IConvGetBytes (IntPtr converter, char[] chars, int charIndex,
374 int charCount, byte[] bytes, int byteIndex);
376 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
377 internal extern static int IConvGetCharCount (IntPtr converter, byte[] bytes,
378 int index, int count);
380 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
381 internal extern static int IConvGetChars (IntPtr converter, byte[] bytes, int byteIndex,
382 int byteCount, char[] chars, int charIndex);