我们有麻烦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。
更困扰和混乱早晨起床后,我们找到了答案,这个问题。
我们缺少,这是使这个非常混乱的关键点,是字符串类型总是在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()?