Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字节[]读取特殊字符_C#_.net - Fatal编程技术网

C# 从字节[]读取特殊字符

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

我正在从Mifare-
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。