2013-06-10 2 views
7

Я writing и reading от Mifare - RFID карты.Чтение специальных символов из байт []

Для WRITE в карты, я использую Byte[] так:

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

Затем к READ с карты, я получаю ошибку с special characters, когда он должен показать мне é, ã, õ, á, à... Я получаю ? вместо:

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); 

например: вместо того, чтобы я Àgua, amanhã, você я получаю/чтения ?gua, amanh?, voc?.
Как я могу его решить?

+0

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

+2

Не значения 'result',' result2', и 'result3' выглядят иначе? Кроме того, если вы написали данные в формате 'ASCII', вы должны были бы прочитать его обратно в том же самом. –

+0

Вам нужно выяснить, какая кодировка 'byte []' изначально была создана, если вы хотите ее декодировать - вам нужно использовать ту же самую кодировку. – Oded

ответ

8

ASCII по самому своему определению поддерживает только 128 символов.

Что вам нужно, это символы ANSI, если вы читаете устаревший текст.

Вы можете использовать Encoding.Default вместо для интерпретации символов на кодовой странице кода ANSI по умолчанию.

В идеале, вы должны точно знать, какой код страницы вы ожидаете символы ANSI использовать и указать кодовую страницу явно с помощью this overload of Encoding.GetEncoding(int codePage), например:

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

Вот очень хорошая ссылка на страницу на Unicode: http://www.joelonsoftware.com/articles/Unicode.html

и еще здесь: http://msdn.microsoft.com/en-us/library/b05tb6tz%28v=vs.90%29.aspx

Но, может быть, вы можете просто использовать UTF8 при чтении и записи

Я не знаю деталей устройства для чтения карт. Являются ли данные, которые вы читаете и записываете на карту, просто загружают байты?

Если это так, вы можете использовать UTF8 для чтения и записи, и все это будет работать. Необходимо использовать ANSI, если вы работаете с устаревшим устройством, которое ожидает (или предоставляет) ANSI-текст. Если устройство просто хранит байты вслепую, не подразумевая какой-либо конкретный формат, вы можете делать то, что вам нравится - в этом случае всегда используйте UTF8.

+0

Должен ли я использовать «Encoding.Default» как для «чтения», так и для «записи» на карту? – Ghaleon

+0

Этот вопрос показывает, что вы не поняли, что он говорит. Если ASCII поддерживает только 128 символов - как это должно быть хорошо для написания специальных символов, которые вам нужны? –

+0

@Ghaleon В идеале вы должны точно определить, какую кодовую страницу использовать карту, и точно указать ее - но что бы это ни было, вы * должны будете указать его для * обоих * чтения и записи. Когда вы прочтете, строка будет преобразована из ANSI в Unicode, а также будет преобразована обратно в ANSI при записи строки на карту. –

4

Похоже, что вы используете символы, которые не отображаются в 7-битных ASCII, но в «расширениях» ISO-8859-1 или ISO-8859-15. Вам нужно будет выбрать конкретную кодировку для сопоставления в ваш массив байтов, и все должно работать нормально;

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

Должен ли я использовать этот код для обоих методов записи/чтения? – Ghaleon

+1

@Ghaleon Вы должны обязательно использовать ту же кодировку для чтения и записи. Если у вас есть другие системы чтения/записи, кодирование, очевидно, должно быть таким же, как и они, поэтому, если вы не знаете, какая именно кодировка, вы можете сначала попытаться прочитать данные, написанные другой системой, чтобы убедиться, что кодировка верна , Обратите особое внимание на символ евро, который доступен только в ISO-8859-15. –

+0

Есть большая разница между 'ИСО-8859-1' и' utf-8'? Я попробовал оба, и оба работали ... – Ghaleon

1

У вас есть две проблемы: там

  1. ASCII поддерживает только ограниченное количество символов.
  2. В настоящее время вы используете две разные кодировки для чтения и записи.

Вы должны написать с тем же кодированием, что и вы.

Запись

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

Чтение

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

Я сделал это с ASCII; x. Должен ли я пытаться «писать/читать», используя другую «кодировку»? – Ghaleon

+1

Да - используя кодировку (ASCII), которая не поддерживает символы для записи карты, как вы думаете, что будете читать? –

+1

Просто убедитесь, что оба они одинаковы и что вы не используете ASCII. – Andre

Смежные вопросы