C#Encoding.UTF8弄乱了字节[]

SJu*_*ejo 3 c# utf-8 character-encoding

我面临着很奇怪的问题,我有一个字节[],当我路过这Convert.UTF8.GetString(字节[]字节)的方法,系统编码与我搞乱字节和更换只有少数特殊字节(我我在我的系统中使用标记来表示三个字符串表示法.

[0] 70  byte
[1] 49  byte
[2] 45  byte
[3] 86  byte
[4] 49  byte
[5] 253 byte     <-- Special byte
[6] 70  byte
[7] 49  byte
[8] 45  byte
[9] 86  byte
[10]50  byte
[11]253 byte     <-- Special byte
[12]70  byte
[13]49  byte
[14]45  byte
[15]86  byte
[16]51  byte
Run Code Online (Sandbox Code Playgroud)

当我将上面的byte []传递给Encoding.UTF8.GetString(bytes)方法时,我得到以下输出;

private Encoding _encoding = System.Text.Encoding.GetEncoding("UTF-8", new EncoderReplacementFallback("?"), new DecoderReplacementFallback("?"));       
_encoding.GetString(bytes)  "F1-V1?F1-V2?F1-V3" string
Run Code Online (Sandbox Code Playgroud)

实际值不应该为' ',因为这意味着它无法编码并用' '替换那些特殊字节.无论如何我可以解决这个问题,即转换为字符串并将特殊字节表示保留为单个字符.

我有以下特殊字节,我试图用作标记;

byte AM = (byte) 254
byte VM = (byte) 253
byte SM = (byte) 252 
Run Code Online (Sandbox Code Playgroud)

您的帮助和意见将不胜感激.

谢谢,

-

Sheeraz

Jon*_*Jon 7

您不能将这些特殊值用作UTF-8字符串中的标记,因为根据UTF-8 编码规则,该字符串最终无效.

可以偷偷插入他们,然后带他们回来了之前的数据被送到UTF-8数据的相关代码一样Encoding.GetString,但是这不是一个好主意,正是因为它是偷偷摸摸的(方式混乱的人谁已经不知道什么巫术是发生在在那里,因此非常适得其反).

更合理的选择是在字符串中简单地插入"特殊"UTF-8编码字符.这在技术上是需要的(特别是如果你选择一个编码为1字节的字符,因为那些字符也更有可能发生在你的实际有效载荷中),你也会想出一个方案,当这些字符在你的有效载荷中自然出现时逃脱它们.