在C#中的字符串/字符编码什么GetBytes会()之间的GetString())的区别,和转换(?

2019-07-18 02:01发布

我们有麻烦Unicode字符串转换为UTF-8字符串通过网络发送:

// Start with our unicode string.
string unicode = "Convert: \u10A0";

// Get an array of bytes representing the unicode string, two for each character.
byte[] source = Encoding.Unicode.GetBytes(unicode);

// Convert the Unicode bytes to UTF-8 representation.
byte[] converted = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, source);

// Now that we have converted the bytes, save them to a new string.
string utf8 = Encoding.UTF8.GetString(converted);

// Send the converted string using a Microsoft function.
MicrosoftFunc(utf8);

虽然我们已经转换的字符串为UTF-8,它没有到达为UTF-8。

Answer 1:

更困扰和混乱早晨起床后,我们找到了答案,这个问题。

我们缺少,这是使这个非常混乱的关键点,是字符串类型总是在16位(2字节)的Unicode编码 。 这意味着,当我们做对字节的GetString的(),它们会自动被重新编码成Unicode 幕后 ,我们没有更好的比我们都摆在首位。

当我们开始在另一端得到的字符错误,和双字节数据,我们知道出事了,但在我们有代码的一目了然,我们看不到任何错误。 学习我们上面解释后,我们意识到,我们需要如果我们想保留编码来发送字节数组。 幸运的是,MicrosoftFunc()有过载,其能够采取一个字节数组而不是字符串。 这意味着我们可以将Unicode字符串转换为我们选择的编码,然后把它送上正是因为我们期望它。 该代码更改为:

// Convert from a Unicode string to an array of bytes (encoded as UTF8).
byte[] source = Encoding.UTF8.GetBytes(unicode); 

// Send the encoded byte array directly! Do not send as a Unicode string.
MicrosoftFunc(source);

摘要:

所以在最后,从上面我们可以看出:

  • GetBytes会()除其他事项外,确实从Unicode的Encoding.Convert()(因为字符串始终Unicode)的和指定的编码函数是从调用,并返回编码的字节的阵列。
  • 的GetString()除其他事项外,执行一次Encoding.Convert()从指定的编码功能由为Unicode称为(因为字符串始终Unicode)的 ,并返回它作为一个字符串对象。
  • 转换()实际上转换一个编码的字节数组到另一个编码的另一个字节数组。 显然字符串不能使用(因为字符串都是以Unicode编码)。


文章来源: In C# String/Character Encoding what is the difference between GetBytes(), GetString() and Convert()?