2011-09-06 28 views
10

tôi cần phải lấy một danh sách các mã hóa được hỗ trợ, nhưng tôi đang sử dụng .NET 1.1, vì vậy cuộc gọi sau đây là không có sẵn:Nhận danh sách Encoding trong .NET 1.1

using System; 
using System.Text; 

public class SamplesEncoding 
{ 
    public static void Main() 
    { 
     // For every encoding, get the property values. 
     foreach(EncodingInfo ei in Encoding.GetEncodings()) 
     { 
     Encoding e = ei.GetEncoding(); 

     Console.Write("{0,-6} {1,-25} ", ei.CodePage, ei.Name); 
     Console.Write("{0,-8} {1,-8} ", e.IsBrowserDisplay, e.IsBrowserSave); 
     Console.Write("{0,-8} {1,-8} ", e.IsMailNewsDisplay, e.IsMailNewsSave); 
     Console.WriteLine("{0,-8} {1,-8} ", e.IsSingleByte, e.IsReadOnly); 
     } 
    } 
} 

Cuộc gọi Encoding.GetEncodings() là không có sẵn cho .NET 1.1. Bạn có biết bất kỳ phương pháp thay thế nào để có được danh sách đó không?

+4

Nâng cấp lên .NET 2.0? – dtb

+2

@dtb Bạn có phải là một trong những người đăng bài "Sử dụng Java" khi ai đó đăng câu hỏi .Net không? ;-) – Justin

+0

@dtb: Cuộc sống của tôi sẽ hạnh phúc hơn nhiều, nhưng tôi không thể –

Trả lời

4

Khá đơn giản: NET 1.1 là " cố định ": nó sẽ không thay đổi. Bạn lấy Encodings of 2.0 và kiểm tra nếu chúng đã có mặt trong 1.1. Ví dụ:

string[] encs = new string[] { 
    "IBM037", "IBM437", "IBM500", "ASMO-708", "DOS-720", "ibm737", 
    "ibm775", "ibm850", "ibm852", "IBM855", "ibm857", "IBM00858", 
    "IBM860", "ibm861", "DOS-862", "IBM863", "IBM864", "IBM865", 
    "cp866", "ibm869", "IBM870", "windows-874", "cp875", 
    "shift_jis", "gb2312", "ks_c_5601-1987", "big5", "IBM1026", 
    "IBM01047", "IBM01140", "IBM01141", "IBM01142", "IBM01143", 
    "IBM01144", "IBM01145", "IBM01146", "IBM01147", "IBM01148", 
    "IBM01149", "utf-16", "utf-16BE", "windows-1250", 
    "windows-1251", "Windows-1252", "windows-1253", "windows-1254", 
    "windows-1255", "windows-1256", "windows-1257", "windows-1258", 
    "Johab", "macintosh", "x-mac-japanese", "x-mac-chinesetrad", 
    "x-mac-korean", "x-mac-arabic", "x-mac-hebrew", "x-mac-greek", 
    "x-mac-cyrillic", "x-mac-chinesesimp", "x-mac-romanian", 
    "x-mac-ukrainian", "x-mac-thai", "x-mac-ce", "x-mac-icelandic", 
    "x-mac-turkish", "x-mac-croatian", "utf-32", "utf-32BE", 
    "x-Chinese-CNS", "x-cp20001", "x-Chinese-Eten", "x-cp20003", 
    "x-cp20004", "x-cp20005", "x-IA5", "x-IA5-German", 
    "x-IA5-Swedish", "x-IA5-Norwegian", "us-ascii", "x-cp20261", 
    "x-cp20269", "IBM273", "IBM277", "IBM278", "IBM280", "IBM284", 
    "IBM285", "IBM290", "IBM297", "IBM420", "IBM423", "IBM424", 
    "x-EBCDIC-KoreanExtended", "IBM-Thai", "koi8-r", "IBM871", 
    "IBM880", "IBM905", "IBM00924", "EUC-JP", "x-cp20936", 
    "x-cp20949", "cp1025", "koi8-u", "iso-8859-1", "iso-8859-2", 
    "iso-8859-3", "iso-8859-4", "iso-8859-5", "iso-8859-6", 
    "iso-8859-7", "iso-8859-8", "iso-8859-9", "iso-8859-13", 
    "iso-8859-15", "x-Europa", "iso-8859-8-i", "iso-2022-jp", 
    "csISO2022JP", "iso-2022-jp", "iso-2022-kr", "x-cp50227", 
    "euc-jp", "EUC-CN", "euc-kr", "hz-gb-2312", "GB18030", 
    "x-iscii-de", "x-iscii-be", "x-iscii-ta", "x-iscii-te", 
    "x-iscii-as", "x-iscii-or", "x-iscii-ka", "x-iscii-ma", 
    "x-iscii-gu", "x-iscii-pa", "utf-7", "utf-8" 
}; 

foreach (string enc in encs) 
{ 
    try { 
     Encoding.GetEncoding(enc); 
    } catch { 
     Console.WriteLine("Missing {0}", enc); 
    } 
} 

(vâng, đó là danh sách đầy đủ của mã hóa trình bày trong .NET 4.0 ... Nếu bạn cần chúng về giá trị "số", nó sẽ là khá dễ dàng để làm điều đó). Sau đó, bạn lấy những cái không hoạt động và lấy chúng ra khỏi danh sách đó.

Để tạo ra chúng (tối thiểu .NET 2.0 và C# 3.0):

var encs = Encoding.GetEncodings().Select(p => p.Name); 
//var encs = Encoding.GetEncodings().Select(p => p.CodePage); 

var sb = new StringBuilder("var encs = new[] {"); 

foreach (var enc in encs) { 
    sb.Append(" \"" + enc + "\","); 
    //sb.Append(" " + enc + ","); 
} 

sb.Length--; 

sb.Append(" };"); 

var str = sb.ToString(); 

Console.WriteLine(str); 
+0

' phần var' trong foreach không hợp lệ đối với .NET 1.1. Cảm ơn bạn đã giúp đỡ! –

+0

@Daniel Woops. Đã sửa. – xanatos

1

Các tài liệu nói rằng bạn nên sử dụng Encoding.GetEnconding(int CodePage) nơi CodePage nên là một trong:

Các trang mã Windows sau tồn tại:

874 — Thai 
932 — Japanese 
936 — Chinese (simplified) (PRC, Singapore) 
949 — Korean 
950 — Chinese (traditional) (Taiwan, Hong Kong) 
1200 — Unicode (BMP of ISO 10646, UTF-16LE) 
1201 — Unicode (BMP of ISO 10646, UTF-16BE) 
1250 — Latin (Central European languages) 
1251 — Cyrillic 
1252 — Latin (Western European languages) 
1253 — Greek 
1254 — Turkish 
1255 — Hebrew 
1256 — Arabic 
1257 — Latin (Baltic languages) 
1258 — Vietnamese 
65000 — Unicode (BMP of ISO 10646, UTF-7) 
65001 — Unicode (BMP of ISO 10646, UTF-8) 

Taken from Wikipedia

2

Giả sử tôi đã không hoàn toàn hiểu lầm tình hình (rất có thể), sau đây nên làm việc nếu bạn có khoảng một hoặc hai phút chờ đợi. Nó thực sự là chậm, chưa kể một chút xấu xí.

public static Encoding[] GetList() 
{ 
    ArrayList arrayList; 
    arrayList = new ArrayList(); 
    for (int i = 0; i < 65535; i++) 
    { 
     try 
     { 
      arrayList.Add(Encoding.GetEncoding(i)); 
     } 
     catch(Exception ex) 
     { 
     } 
    } 
    return (Encoding[])arrayList.ToArray(typeof(Encoding)); 
} 
Các vấn đề liên quan