C# 从字节[]读取特殊字符
我正在从Mifare-C# 从字节[]读取特殊字符,c#,.net,C#,.net,我正在从Mifare-RFID卡中写入和读取 要将写入卡中,我使用的是字节[],如下所示: byte[] buffer = Encoding.ASCII.GetBytes(txt_IDCard.Text); 然后,要从卡中读取,我在特殊字符中遇到了一些错误,而它应该显示é,õ,õ,á,á…我得到了?: string result = System.Text.Encoding.UTF8.GetString(buffer); string result2 = System.Text.Encod
RFID
卡中写入
和读取
要将写入卡中,我使用的是字节[]
,如下所示:
byte[] buffer = Encoding.ASCII.GetBytes(txt_IDCard.Text);
然后,要从卡中读取,我在特殊字符中遇到了一些错误,而它应该显示é,õ,õ,á,á…
我得到了?
:
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:相反,我得到的是瓜阿,阿曼哈,沃克
我收到/读取?瓜阿,阿曼哈,沃克
我该如何解决它呢?根据ASCII的定义,它只支持128个字符
如果您正在阅读旧文本,您需要的是ANSI字符
您可以使用Encoding.Default
而不是Encoding.ASCII
来解释当前语言环境的默认ANSI代码页中的字符
理想情况下,您应该确切地知道希望使用ANSI字符的代码页,并明确使用指定代码页,例如:
string result = System.Text.Encoding.GetEncoding(1252).GetString(buffer);
这里有一个非常好的Unicode参考页面:
这里还有一个:
但也许您可以在读写时使用UTF8
我不知道读卡器的细节。您读写到卡中的数据只是一个字节负载吗
如果是这样,您可以使用UTF8进行读写,这一切都会正常工作。只有在使用期望(或提供)ANSI文本的旧设备时,才需要使用ANSI。如果设备只是盲目地存储字节而不使用任何特定格式,您可以随心所欲—在这种情况下,只需始终使用UTF8。看起来您使用的字符没有映射到7位ASCII中,而是映射到“扩展名”ISO-8859-1或ISO-8859-15中。你需要选择一个特定的编码来映射到你的字节数组,一切都会很好
byte[]buffer=Encoding.GetEncoding(“ISO-8859-1”).GetBytes(txt_IDCard.Text);
您有两个问题:
ASCII仅支持有限数量的字符
您当前正在使用两种不同的编码进行读写
你应该用和你读的相同的编码来写
书写
byte[] buffer = Encoding.UTF8.GetBytes(txt_IDCard.Text);
阅读
string result = Encoding.UTF8.GetString(buffer);
result
、result2
和result3
的值看起来不一样吗?此外,如果您以ASCII
格式写入数据,则必须以相同的格式读回。如果您希望对其进行解码,则需要找出字节[]
最初使用的编码方式-您需要使用相同的编码。@MichaelPerrenoud yes,在result2
中,它从ASCII
读取它所写入的相同编码。但是所有的结果看起来都是一样的。@Oded,正如您所看到的,我使用编码.ASCII.GetBytes(string)
获取字符串并将其转换为字节[]
当我将字节[]反向转换为Strin时,它不起作用\我应该使用编码吗?默认情况下,读和写都要使用编码吗?这个问题表明你没有理解他说的话。如果ASCII仅支持128个字符-它对编写您需要的特殊字符有什么好处?@Ghaleon理想情况下,您应该准确地找出卡使用的代码页,并准确地指定它-但无论它是什么,您都需要为读写指定它。阅读时,字符串将从ANSI转换为Unicode,在将字符串写入卡时,还需要将字符串转换回ANSI。明白了@ThorstenDittmar!我会看看Matthew的链接来了解encods!你推荐哪一款?@Ghaleon注意到我刚才在回答中添加的最后一段。如果您的设备不关心数据是什么,只需在读取和写入数据时使用UTF8即可。如果您有使用ANSI编码的遗留文本,那么您才需要使用ANSI代码页;十,。我是否应该尝试使用不同的编码写入/读取
?是-使用不支持写卡字符的编码(ASCII),您认为您将读取什么?只需确保两者相同,并且不使用ASCII。@Ghaleon您肯定应该对读取和写入使用相同的编码。如果您有其他系统在读/写,那么编码显然需要与它们使用的编码相同,因此除非您知道它是哪种编码,否则您可以首先尝试读取另一个系统写入的数据,以查看编码是否正确。请特别注意仅在ISO-8859-15中可用的欧元符号。ISO-8859-1
和utf-8
之间是否存在较大差异?我尝试了这两种方法,两种方法都有效…@Ghaleon都有这些字符,但字节的编码方式肯定不同。换句话说,如果您正在与其他系统进行互操作,您肯定会想知道这些系统使用哪种编码。如果不进行互操作并且空间不是很有限,我会一直使用UTF8。