Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading special characters from Byte[]

Tags:

c#

.net

I'm writing and readingfrom Mifare - RFID cards.

To WRITE into the card, i'm using a Byte[] like this:

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

Then, to READ from the card, I'm getting some error with special characters, when it's supposed to show me é, ã, õ, á, à... I get ? instead:

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

e.g: Instead I get Àgua, amanhã, você I receive/read ?gua, amanh?, voc?.
How may I solve it ?

like image 378
Ghaleon Avatar asked Jun 10 '13 12:06

Ghaleon


People also ask

What is a byte [] in C#?

In C#, byte is the data type for 8-bit unsigned integers, so a byte[] should be an array of integers who are between 0 and 255, just like an char[] is an array of characters.


1 Answers

ASCII by its very definition only supports 128 characters.

What you need is ANSI characters if you are reading legacy text.

You can use Encoding.Default instead of Encoding.ASCII to interpret characters in the current locale's default ANSI code page.

Ideally, you would know exactly which code page you are expecting the ANSI characters to use and specify the code page explicitly using this overload of Encoding.GetEncoding(int codePage), for example:

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

Here's a very good reference page on Unicode: http://www.joelonsoftware.com/articles/Unicode.html

And another here: http://msdn.microsoft.com/en-us/library/b05tb6tz%28v=vs.90%29.aspx

But maybe you can just use UTF8 when reading and writing

I don't know the details of the card reader. Is the data you read and write to the card just a load of bytes?

If so, you can just use UTF8 for both reading and writing and it will all just work. It's only necessary to use ANSI if you are working with a legacy device which is expecting (or providing) ANSI text. If the device just stores bytes blindly without implying any particular format, you can do what you like - in this case, just always use UTF8.

like image 100
Matthew Watson Avatar answered Sep 20 '22 15:09

Matthew Watson