从字节中读取特殊字符[]

时间:2013-06-10 12:15:38

标签: c# .net

我来自Mifare的writingreading - 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? 我该如何解决?

3 个答案:

答案 0 :(得分:8)

ASCII的定义只支持128个字符。

如果您正在阅读遗留文本,那么您需要的是ANSI字符。

您可以使用Encoding.Default代替Encoding.ASCII来解释当前区域设置的默认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。

答案 1 :(得分:5)

您似乎使用的是未在7位ASCII中映射的字符,而是在“扩展”ISO-8859-1或ISO-8859-15中。你需要选择一个特定的编码来映射到你的字节数组,事情应该可以正常工作;

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

答案 2 :(得分:1)

你有两个问题:

  1. ASCII仅支持有限数量的字符。
  2. 您目前正在使用两种不同的编码来进行读写。
  3. 您应该使用与阅读时相同的编码进行编写。

    书写

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

    阅读

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