70-536: Encoding and Decoding

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

Tagi: , ,

Comments

trackback
dotnetomaniak.pl
11/9/2009 7:40:00 AM Permalink

70-536: Encoding and Decoding | Eastgroup.pl

Dziękujemy za publikację - Trackback z dotnetomaniak.pl

pingback
jarzynka.boo.pl
1/11/2010 12:15:48 PM Permalink

Pingback from jarzynka.boo.pl

Certyfikat 70-563 | DanielJarzynka.net

Add comment


(Will show your Gravatar icon)

  Country flag

biuquote
  • Comment
  • Preview
Loading