2016-12-20 12 views
5

Jeśli zapiszę ten ciąg do pliku tekstowego;C# ' n' zapisane w różnych bajtach niż oczekiwano

Witam \ n jest wiadomość testowa

n znak \ jest zapisywany jako HEX [5C 6E] Chciałbym mieć to zapisane jako [0A].

Uważam, że jest to problem związany z kodowaniem?

Używam;

// 1252 is a variable in the application 
Encoding codePage = Encoding.GetEncoding("1252"); 
Byte[] bytes = new UTF8Encoding(true).GetBytes("Hello this \\n is a test message"); 
Byte[] encodedBytes = Encoding.Convert(Encoding.UTF8, codePage , bytes); 

Wszystko to znajduje się wewnątrz zakresu FileStream i wykorzystuje fs.Write pisać encodedBytes do pliku.

Próbowałem użyć \ r \ n ale miał taki sam wynik.

Wszelkie sugestie?

Dzięki!

EDIT

Ciąg jest odczytywana z pliku tsv i umieszcza się w tablicy ciągów. Ciąg będący do odczytu ma w sobie "\ n".

Aby przeczytać ciąg używam StreamReader reader i podzielone na \ t

+4

Więc dlaczego zdefiniować go jako ' '\' '+' n'? Użyj '" \ n "': '" Witaj, \ n to wiadomość testowa "' –

+2

'' \ ''to 5C. '' n'' to 6E. ('' \\ "' tworzy znak ukośnika odwrotnego.) – molbdnilo

+2

Nie rozumiem. W jaki sposób można poprawić to pytanie? – Bathsheba

Odpowiedz

10

w czasie wykonywania, ciąg zawiera znak ukośnika następnie przez n. Są one kodowane dokładnie tak, jak powinny być. Jeśli rzeczywiście chcesz znakiem końca wiersza, nie powinno być ucieczki ukośnik w kodzie:

Byte[] bytes = new UTF8Encoding(true).GetBytes("Hello this \n is a test message"); 

To ciąg dosłowne wykorzystuje \n do reprezentacji U + 000A, postać wysuw. W czasie wykonywania ciąg nie będzie zawierał ukośnika odwróconego ani wartości - będzie zawierał tylko wiersz.

Jednak kod jest już dziwne, że jeśli chcesz uzyskać zakodowaną postać łańcucha, nie ma powodu, aby przejść przez UTF-8:

byte encodedBytes = codePage.GetBytes("Hello this \n is a test message"); 
+0

Dziękuję. Zakładałem, że problem polega na tym, w jaki sposób kodowałem, a nie jak czytałem ciąg. –