Pytanie Czytaj pliki txt (w unicode i utf8) za pomocą C #


Stworzyłem dwa pliki txt (Windows Notepad) z tą samą treścią "thank you - спасибо" i zapisałem je w utf8 i unicode. W notatniku wyglądają dobrze. Potem próbowałem je odczytać za pomocą .Net:

...File.ReadAllText(utf8FileFullName, Encoding.UTF8);

i

...File.ReadAllText(unicodeFileFullName, Encoding.Unicode);

Ale w obu przypadkach otrzymałem to "dziękuję - ???????". Co jest nie tak?

Aktualizacja: kod dla utf8

static void Main(string[] args)
        {
            var encoding = Encoding.UTF8;
            var file = new FileInfo(@"D:\encodes\enc.txt");
            Console.OutputEncoding = encoding;
            var content = File.ReadAllText(file.FullName, encoding);
            Console.WriteLine("encoding: " + encoding);
            Console.WriteLine("content: " + content);
            Console.ReadLine();
        }

Wynik: dzięki ÑпР° ÑиР± о


10
2017-09-18 11:55


pochodzenie


Kodowanie używane domyślnie w Notatniku to Encoding.Default. Niezgodny z Twoimi wyborami. Kompatybilność z aplikacjami Windows jest legendarna, ale przeszkadza w nowoczesnych praktykach. Nie wahaj się uderzyć Notatnikiem nad głową, zmieniając wybór kodowania w combobox. Lub użyj lepszego edytora tekstu, który zapisuje BOM. - Hans Passant


Odpowiedzi:


Edytowano jako UTF8 powinien wspierać bohaterów. Wygląda na to, że wyświetlasz konsolę lub lokalizację, która nie ma swojego zestawu kodowania. Jeśli tak, musisz ustawić kodowanie. Dla konsoli możesz to zrobić

string allText = File.ReadAllText(unicodeFileFullName, Encoding.UTF8);
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine(allText);

9
2017-09-18 11:59



Proszę nie używać liczb magicznych w kodzie, wyodrębnić go jako stałą: P - Darius
@SCRIPTONITE - zaktualizowano :) - keyboardP
Ale zapisałem plik w utf8 (w notatniku wygląda normalnie) i dlaczego nie mogę go odczytać w Encoding.UTF8? - mtkachenko
@oblomov - Czy wyprowadzasz na konsolę (która pokazuje wtedy ???????)? (zaktualizowana odpowiedź) - keyboardP
@keyboardP - Tak, do konsoli. - mtkachenko


Użyj domyślnego ustawienia Kodowania

File.ReadAllText(unicodeFileFullName, Encoding.Default);

Naprawi to ???? Znaki.


3
2017-07-18 05:10



Co to jest Encoding.Default? Jak to działa? - mtkachenko
Zasadniczo korzysta z obecnego systemu Format kodowania. I zwróć to, co widzisz na swoich tekstach systemów - alireza amini
Różne serwery mogą mieć inny kodowanie. Domyślnie to nie jest bezpieczne. - mtkachenko
Tak masz rację - alireza amini


Podczas wysyłania wielobajtowych znaków kodowanych w standardzie Unicode lub UTF-8 do konsoli należy ustawić kodowanie, a także upewnić się, że konsola ma zestaw czcionek obsługujących znak wielobajtowy w celu wyświetlenia odpowiedniego glifu. Za pomocą istniejącego kodu komunikat MessageBox.Show (zawartość) lub ekran w systemie Windows lub formularzu internetowym będzie wyświetlany poprawnie.

Spójrz na http://msdn.microsoft.com/en-us/library/system.console.aspx dla wyjaśnienia ustawień czcionek w oknie konsoli.

"Obsługa znaków Unicode wymaga, aby koder rozpoznał konkretny znak Unicode, a także wymaga czcionki z glifami potrzebnymi do renderowania tej postaci. Aby pomyślnie wyświetlać znaki Unicode w konsoli, czcionka konsoli musi być ustawiona na czcionkę inną niż rastrowa lub TrueType, taką jak Consolas lub Lucida Console. "

Na marginesie można użyć klasy FileStream do odczytania pierwszych trzech bajtów pliku i poszukać wskaźnika znacznika kolejności bajtów, aby automatycznie ustawić kodowanie podczas odczytu pliku. Na przykład, jeśli byte [0] == 0xEF && byte [1] == 0xBB && byte [2] == 0xBF to masz plik zakodowany w UTF-8. Odnosić się do http://en.wikipedia.org/wiki/Byte_order_mark po więcej informacji.


2
2017-09-18 14:19



Artykuł Wiki po prostu wskazuje, że oprogramowanie Microsoftu jest głupie. Spowodowało to, że wielu programistów myślało, że BOM jest częścią UTF8 - tak nie jest. Nie mam nic przeciwko głosowaniu w dół dla tej odpowiedzi, ponieważ jestem tylko chwytając o dodatkową pracę, którą muszę zrobić, by parsować plik tekstowy, ponieważ stwardnienie rozsiane nie przestrzega norm. Lepszym rozwiązaniem może być link do CAŁEGO artykułu: en.wikipedia.org/wiki/UTF-8 - Richard Robertson