2013-02-22 8 views
7

I stworzył aplikację przykładową załadować wszystkie znaki specjalne podczas kopiowania wklejenie z OpenOffice Writer do Notatnika. Podwójne kody są różne i kiedy próbuję to załadować.Emisja o 65.533 w C# pliku tekstowego czytania

var lines = File.ReadAllLines("..\\ter34.txt"); 

Stwarza to problem 65533 Issue przychodzi i plik tekstowy zawiera:

ta została zmieniona na symbol:

+2

Co kodowanie jest plik tekstowy za pomocą? ANSI? ASCII? UTF8? UTF16? –

+0

Problem pojawia się tylko w ANSI .... Reszta rzeczy działa poprawnie zmienia się na - "- –

+1

Tylko dla tych, którzy mogą nie wiedzieć. '(Char) 65533' jest również znany jako U + FFFD i jest WYMIENNYM CHARAKTEREM. Jest to często emitowane, gdy dane do przekonwertowania są uszkodzone lub gdy kodowanie do konwersji nie może reprezentować właściwego znaku. Zobacz [Wikipedia] (http://en.wikipedia.org/wiki/Specials_ (Unicode_block) #Replacement_character). –

Odpowiedz

20

U+FFFD jest "Unicode charakter wymiana" , który jest używany, jeśli dane, które próbujesz odczytać, są nieprawidłowe dla kodowania, które jest używane do konwersji danych binarnych na tekst.

Na przykład, jeśli wypiszesz plik używając ISO-8859-1, ale spróbujesz odczytać używając UTF-8, możesz łatwo skończyć z niektórymi sekwencjami bajtowymi, które po prostu nie są poprawne UTF -8. Każdy nieprawidłowy bajt zostanie domyślnie przetłumaczony na U + FFFD.

Zasadniczo trzeba zapewnić właściwą kodowanie File.ReadAllLines, jako drugi argument. To oczywiście oznacza, że ​​musisz najpierw poznać kodowanie pliku.

+0

Co dziwne, zawsze uważałem, że jest to po prostu niestandardowa biblioteka przesyłania strumieniowego/transkodowania danych. Czy jest to dobrze zdefiniowane zachowanie transkodowania Unicode? Wspaniały! – quetzalcoatl

+0

Kiedy zapisać plik txt w formatach takich jak UTF-8, Unicode ..etc jego działa poprawnie, ale kiedy go zapisać w ANSI .. wtedy symbol pochodzi –

+0

plików Unicode można przedstawić wiele różnych znaków, natomiast ANSI - na wybranych CodePage utrzymaniu i zwykle znacznie mniej. Kiedy próbujesz zapisać jakiś "rozszerzony" znak do pliku ANSI, masz kilka szans, że ten znak po prostu nie może być przetłumaczony na tę stronę ANSI CodePage, którą wybrałeś (lub domyślnie). W takich przypadkach, trzy rzeczy może się zdarzyć: wyjątek może zostać wyrzucony i crash Everythin więc widać nie jest to problem, lub tych znaków może być dyskretnie pominięte (eeviill), lub jakiś znak „wymiana” jest zapisane do pliku zamiast więc widać jest problem – quetzalcoatl

Powiązane problemy