konwersja miedzy stronami kodowymi 852 i 1250

0

Witajcie!

Potrzebuję procedurę konwersji miedzy stronami kodowymi 852 i 1250. Jako, że nie znalazłem niczego konkretnego (wszędzie jest tylko konwersja z ascii do unicode) przerobiłem standardową procedurę konwersji podaną w MSDN. Niestety nie działa, jak należy.
Moje pytanie - co jest źle? Albo inaczej - czy błędne działanie wynika z tego, iż wzorcowa procedura robiła konwersję z unicode a ja biorę ascii?

Z góry dzięki za pomoc!

M.


public static String ZmienKodowanie(String TekstDoZmiany)

        {

 
            Encoding EncDEST = Encoding.GetEncoding(1250);
            Encoding EncSRC = Encoding.GetEncoding(852);

 
            byte[] unicodeBytes = EncSRC.GetBytes(TekstDoZmiany);

 
            byte[] asciiBytes = Encoding.Convert(EncSRC, EncDEST, unicodeBytes);

 
            char[] asciiChars = new char[EncDEST.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
            EncDEST.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
            string asciiString = new string(asciiChars);

            return asciiString;
        
        }




 
2

Widziałem ten przykład. jest jakiś dziki i nadmiernie skomplikowany: zamiast GetCharCount, GetChars i new string można po prostu użyć GetString.

Ale to nie w tym problem.

string w C# jest ZAWSZE zakodowany w UTF-16. Podobnie tablica znaków char[].
Tekst w jakimkolwiek innym kodowaniu możesz trzymać najwyżej jako tablicę bajtów: byte[].

Jeśli chcesz stringa przerobić na tablicę bajtów zakodowaną w danej stronie kodowej, to robisz tak:

string TekstDoZmiany;
...
byte[] encodedText = Encoding.GetEncoding(1250).GetBytes(TekstDoZmiany);

a jeśli z tablicy otrzymać stringa, to tak:

byte[] encodedText;
...
string tekst = Encoding.GetEncoding(1250).GetString(encodedText);

Konwersję z jednego kodowania na drugie robimy tak:

byte[] cp1250bytes;
...
byte[] cp852bytes = Encoding.Convert(Encoding.GetEncoding(1250), Encoding.GetEncoding(852), cp1250bytes);

Jaką operację chcesz wykonać?

Jeśli dane w 852 pochodzą np. z pliku, to kodowanie należy określić w momencie otwierania pliku.
W momencie gdy dane wczytałeś już jako string to za późno na konwersje.

0

Dokładnie to jest tak:

  1. Otwieram plik DBF przy pomocy Driver do Microsoft dBase (*.dbf) (plik jest o ile wiem w CP852)
  2. wyciągam z niego dane przy pomocy GetString(x)
  3. buduję string zawierający te dane w formie INSERT'a do MS SQLa 2008
  4. Wykonuje tegoż INSERTA

No i rozdźwięk jest taki, że DBF jest w CP852 a baza SQL jest w CP1250 i muszę pozmieniać kodowanie....

1 użytkowników online, w tym zalogowanych: 0, gości: 1