Poniższy artykuł pochodzi z serii Przygotowań do egzaminu 70-536.
W tej lekcji training kit robi długi wstęp na temat: „dlaczego mamy różne kodowania”, który sobie pominiemy. Dopiero na drugiej stronie pojawia się pierwsza istotna dla nas informacja, która mówi, że przestrzeń System.Text dostarcza nam klasy do kodowania i dekodowania. System.Text wspiera następujące kodowania:
- Unicode UTF-32: reprezentuje znaki unicode jako ciągi 32-bitowe. Do konwertowania używamy klasy UTF32Encoding.
- Unicode UTF-16: : reprezentuje znaki unicode jako ciągi 16-bitowe. Do konwertowania używamy klasy UnicodeEncoding.
- Unicode UTF-8: wykorzystuje 8,16,24 oraz 48 bitowe kodowanie. Wartości od 0 do 127 używają
8-bitowego kodowania, od 128-2047 używają 16-bitowego kodowania i zapewniają wsparcie dla alfabetu łacińskiego, greckiego, hebrajskiego, cyrylicy oraz arabskiego. Wartości od 2048-65535 używają 24-bitowego kodowania dla języka Chińskiego, Japońskiego oraz podobnych. Do konwertowania na UTF8 używamy klasy UTF8Encoding.
- ASCII: Co to ASCII wiemy :) Używamy klasy ASCIIEncoding do konwertowania na ASCII.
- ANSI/ISO: System.Text.Encoding wspiera również kodowanie dla szerokiego zakresu ANSI/ISO.
Używanie klas do kodowania
Poniższy kod prezentuje działanie metody Encoding.GetEncoding (która zwraca aktualne kodowanie). W kodzie wywołujemy również metodę Encoding.GetBytes po to, żeby przekonwertować string unicode na jego bajtową postać w kodowaniu Koreańskim.
1: //pobieramy kodowanie koreanskie
2: Encoding e = Encoding.GetEncoding("Korean");
3: //Konwertujemy ascii na kodowanie koreanskie
4: byte[] encoded;
5: encoded = e.GetBytes("Hello world");
6: //wyświetlamy reprezentacje w bajtach
7: for (int i = 0; i < encoded.Length;i++ )
8: {
9: Console.WriteLine("Byte {0} = {1}",i,encoded[i]);
10: }
Jak zbadać wspierane kodowania
Aby zobaczyć wszystkie wspierane kodowania przez .NET, musimy wywołać metodę Encoding.GetEncodings. Ta metoda zwróci nam tablicę obiektów EncodingInfo. Poniższy przykład pokazuje jak to zrobić:
1: EncodingInfo[] ei = Encoding.GetEncodings();
2: foreach (EncodingInfo e in ei)
3: {
4: Console.WriteLine("{0}:{1}, {2}",e.CodePage,e.Name,e.DisplayName);
5: }
Jak określić typ kodowania kiedy zapisujemy plik
Aby to zrobić, musimy użyć przeciążonego konstruktora klasy Stream, który akceptuje obiekty typu Encoding. Robi się to np. tak:
1: StreamWriter swUtf7 = new StreamWriter("utf7.txt", false, Encoding.UTF7);
2: swUtf7.WriteLine("Hello, World!");
3: swUtf7.Close();
4:
5: StreamWriter swUtf8 = new StreamWriter("utf8.txt", false, Encoding.UTF8);
6: swUtf8.WriteLine("Hello, World!");
7: swUtf8.Close();
8:
9: StreamWriter swUtf16 = new StreamWriter("utf16.txt", false, Encoding.Unicode);
10: swUtf16.WriteLine("Hello, World!");
11: swUtf16.Close();
12:
13: StreamWriter swUtf32 = new StreamWriter("utf32.txt", false, Encoding.UTF32);
14: swUtf32.WriteLine("Hello, World!");
15: swUtf32.Close();
W tym przykładzie zapisaliśmy “Hello word” w 4 różnych kodowaniach.
Jak określić typ kodowania podczas czytania z pliku
Zazwyczaj nie musimy określać typu kodowania podczas czytania z pliku ponieważ .NET sam wykrywa większość typów kodowania. Jeśli poczujemy potrzebę określenia kodowania, robimy to w następujący sposób:
1: string fn = "file.txt";
2: StreamWriter sw = new StreamWriter(fn, false, Encoding.UTF7);
3: sw.WriteLine("Hello, World!");
4: sw.Close();
5:
6: StreamReader sr = new StreamReader(fn, Encoding.UTF7);
7: Console.WriteLine(sr.ReadToEnd());
8: sr.Close();
W odróżnieniu od większości typów kodowania, UTF7 potrzebuję określenia kodowania, podczas czytania pliku. Jeśli odpalimy poprzedni przykład bez podania kodowania, otrzymamy niepoprawne rezultaty.
Kolejny artykuł z serii to 70-536 Collections and Dictionaries