2013-06-10 23 views
7

Jestem writing i reading z kart Mifare - RFID.Czytanie znaków specjalnych z Byte []

Aby WRITE do karty, używam Byte[] takiego:

byte[] buffer = Encoding.ASCII.GetBytes(txt_IDCard.Text); 

Następnie, aby READ z karty, dostaję jakiś błąd z special characters, kiedy to ma mi pokazać é, ã, õ, á, à... mam ? zamiast:

string result = System.Text.Encoding.UTF8.GetString(buffer); 
string result2 = System.Text.Encoding.ASCII.GetString(buffer, 0, buffer.Length); 
string result3 = Encoding.UTF7.GetString(buffer); 

np: zamiast dostać Àgua, amanhã, você otrzymam/odczytu ?gua, amanh?, voc?.
Jak mogę to rozwiązać?

+0

http://msdn.microsoft.com/en-us/library/ds4kkd55.aspx – zerkms

+2

Nie wartości 'result',' result2' i 'result3' wyglądają inaczej? Ponadto, jeśli zapisałeś dane w formacie "ASCII", musiałbyś przeczytać je z powrotem w tym samym. –

+0

Musisz dowiedzieć się, jakie kodowanie "byte []" zostało pierwotnie utworzone, jeśli chcesz je zdekodować - musisz użyć tego samego kodowania. – Oded

Odpowiedz

8

ASCII według swojej definicji obsługuje tylko 128 znaków.

Potrzebne są znaki ANSI, jeśli czytasz starszy tekst.

Można użyć Encoding.Default zamiast do interpretacji znaków na stronie kodowej ANSI domyślnej lokalizacji.

Najlepiej, by dokładnie wiedzieć, która strona kodowa spodziewasz znaki ANSI w użyciu i określić stronę kodową jawnie przy użyciu this overload of Encoding.GetEncoding(int codePage), na przykład:

string result = System.Text.Encoding.GetEncoding(1252).GetString(buffer); 

Oto bardzo dobra strona referencyjna na Unicode: http://www.joelonsoftware.com/articles/Unicode.html

i jeszcze tutaj: http://msdn.microsoft.com/en-us/library/b05tb6tz%28v=vs.90%29.aspx

Ale może po prostu użyć UTF8 podczas czytania i pisania

Nie znam szczegółów czytnika kart. Czy dane, które czytasz i zapisujesz na karcie, to tylko ładunek bajtów?

Jeśli tak, możesz po prostu używać UTF8 do czytania i pisania, a wszystko będzie działać. Konieczne jest użycie ANSI tylko w przypadku pracy ze starszym urządzeniem oczekującym (lub dostarczającym) tekstu ANSI. Jeśli urządzenie po prostu zapisuje bajty na ślepo, nie sugerując żadnego konkretnego formatu, możesz zrobić to, co lubisz - w tym przypadku zawsze używaj UTF8.

+0

Czy należy używać 'Encoding.Default' zarówno do" czytania ", jak do' pisania' na karcie? – Ghaleon

+0

To pytanie pokazuje, że nie rozumiesz, co on mówi. Jeśli ASCII obsługuje tylko 128 znaków - jak to ma być dobre do pisania znaków specjalnych, których potrzebujesz? –

+0

@Ghaleon Idealnie powinieneś dowiedzieć się dokładnie, która strona kodowa używa karty i dokładnie ją określić - ale cokolwiek to jest, będziesz * musiał * podać ją * dla * czytania i pisania. Kiedy czytasz, ciąg znaków zostanie przekonwertowany z ANSI na Unicode, a także będzie musiał zostać przekonwertowany z powrotem na ANSI, kiedy napiszesz ciąg znaków na karcie. –

4

Wygląda na to, że używasz znaków, które nie są odwzorowane w 7-bitowym ASCII, ale w "rozszerzeniach" ISO-8859-1 lub ISO-8859-15. Musisz wybrać określone kodowanie do mapowania do tablicy bajtów i rzeczy powinny działać poprawnie;

byte[] buffer = Encoding.GetEncoding("ISO-8859-1").GetBytes(txt_IDCard.Text); 
+0

Czy powinienem użyć tego kodu do obu metod "pisania/czytania"? – Ghaleon

+1

@Ghaleon Powinieneś używać tego samego kodowania zarówno do odczytu, jak i zapisu. Jeśli masz inne systemy do odczytu/zapisu, kodowanie oczywiście musi być takie samo, jak jest używane, więc jeśli nie wiesz, które to kodowanie, możesz najpierw spróbować odczytać dane zapisane przez inny system, aby sprawdzić, czy kodowanie jest poprawne . Zwróć szczególną uwagę na symbol euro, który jest dostępny tylko w ISO-8859-15. –

+0

Czy jest duża różnica między 'ISO-8859-1' i 'utf-8'? Próbowałem obu i oba działały ... – Ghaleon

1

masz dwa problemy tam:

  1. ASCII obsługuje tylko ograniczoną ilość znaków.
  2. Aktualnie używasz dwóch różnych kodowań do czytania i pisania.

Powinieneś pisać z tym samym Kodowaniem co czytasz.

Pisanie

byte[] buffer = Encoding.UTF8.GetBytes(txt_IDCard.Text); 

Reading

string result = Encoding.UTF8.GetString(buffer); 
+0

Zrobiłem to z ASCII; x. Czy powinienem spróbować "pisać/czytać" używając innego "kodowania"? – Ghaleon

+1

Tak - używając kodowania (ASCII), które nie obsługuje znaków do zapisu karty, co myślisz, że ją przeczytasz? –

+1

Upewnij się, że oba są takie same i nie używasz ASCII. – Andre

Powiązane problemy