Poszukałem w Google na ten temat i sprawdziłem każdą odpowiedź, ale nadal jej nie rozumiem.
Zasadniczo muszę przekonwertować ciąg UTF-8 na ISO-8859-1 i robię to za pomocą następującego kodu:
Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
string msg = iso.GetString(utf8.GetBytes(Message));
Mój ciąg źródłowy to
Message = "ÄäÖöÕõÜü"
Niestety, mój ciąg wynikowy to
msg = "�ä�ö�õ�ü
Co tu robię źle?
Encoding.Unicode
i w Win32 API. Unicode to zestaw znaków, a nie kodowanie. UTF-16 jest jednym z kilku kodowań Unicode.)Message
został zdekodowany z UTF-8. Zakładając, że ta część działała poprawnie, konwersja na Latin-1 jest tak prosta jakbyte[] bytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(Message)
. Następnie, jak mówi StuS, możesz przekonwertować bajty Latin-1 z powrotem na UTF-16 za pomocąEncoding.GetEncoding("ISO-8859-1").GetString(bytes)
Odpowiedzi:
Użyj Encoding.Convert, aby dostosować tablicę bajtów przed próbą zdekodowania jej do kodowania docelowego.
źródło
Encoding.GetEncoding("ISO-8859-1").GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("ISO-8859-1"), Encoding.UTF8.GetBytes(myString)))
Myślę, że twój problem polega na tym, że zakładasz, że bajty reprezentujące łańcuch utf8 dadzą ten sam ciąg, gdy zostaną zinterpretowane jako coś innego (iso-8859-1). A tak po prostu nie jest. Polecam przeczytanie tego znakomitego artykułu Joela Spolsky'ego.
źródło
Spróbuj tego:
źródło
W pierwszej kolejności musisz naprawić źródło łańcucha.
Łańcuch w .NET jest w rzeczywistości tablicą 16-bitowych punktów kodowych Unicode, znaków, więc ciąg nie jest w żadnym konkretnym kodowaniu.
Kodowanie zaczyna się wtedy, gdy bierzesz ten ciąg i konwertujesz go na zestaw bajtów.
W każdym razie sposób, w jaki to zrobiłeś, zakodował łańcuch do tablicy bajtów z jednym zestawem znaków, a następnie zdekodował go innym, nie zadziała, jak widzisz.
Czy możesz nam powiedzieć więcej o tym, skąd pochodzi ten oryginalny ciąg i dlaczego uważasz, że został nieprawidłowo zakodowany?
źródło
Wydaje się trochę dziwny kod. Aby pobrać ciąg ze strumienia bajtów Utf8, wszystko, co musisz zrobić, to:
Jeśli chcesz zapisać strumień bajtów iso-8859-1 gdzieś, po prostu użyj: dodatkowej linii kodu dla poprzedniego:
źródło
Po prostu użyłem rozwiązania Nathana i działa dobrze. Musiałem przekonwertować ISO-8859-1 na Unicode:
źródło
źródło
Oto przykład dla ISO-8859-9;
źródło