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

Gha*_*eon 7 .net c#

writingreading来自的Mifare - RFID卡.

WRITE进卡,我使用的是Byte[]这样的:

byte[] buffer = Encoding.ASCII.GetBytes(txt_IDCard.Text);  
Run Code Online (Sandbox Code Playgroud)

然后,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); 
Run Code Online (Sandbox Code Playgroud)

例如:相反,我Àgua, amanhã, você收到/读取?gua, amanh?, voc?.
我该怎么解决?

Mat*_*son 8

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

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

您可以使用Encoding.Default而不是Encoding.ASCII解释当前语言环境的默认ANSI代码页中的字符.

理想情况下,您可以确切地知道您期望使用ANSI字符的代码页,并使用此重载Encoding.GetEncoding(int codePage)明确指定代码页,例如:

string result = System.Text.Encoding.GetEncoding(1252).GetString(buffer);
Run Code Online (Sandbox Code Playgroud)

这是关于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.


Joa*_*son 5

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

byte[] buffer = Encoding.GetEncoding("ISO-8859-1").GetBytes(txt_IDCard.Text);
Run Code Online (Sandbox Code Playgroud)