今天写代码出现了一个错误,就是string类型的变量显示的结果是一个乱码(姹夊瓧1234),就把这个乱码放在windows的文本编辑器的下面,当前的是ansi,将编码格式转为utf8以后变为(汉字1234),(如果是utf8转为ansi会是 濮瑰鐡?234)。我就觉得是需要将这个string由ansi的格式转为utf8就好了,结果在网上搜索了许多的ansi转utf8的算法,有的还直接给出了函数,结果没一个有用的,尴尬了。后来去专门看encoding的资料,在知乎上发现了这个关键:
如果是为了跨平台兼容性,只需要知道,在 Windows 记事本的语境中:
- 所谓的「ANSI」指的是对应当前系统 locale 的遗留(legacy)编码。[1]
- 所谓的「Unicode」指的是带有 BOM 的小端序 UTF-16。[2]
- 所谓的「UTF-8」指的是带 BOM 的 UTF-8。[3]
而简体中文环境就是gbk;也就是搞错了只需要将string以gbk的编码,转为utf8的编码就可以了。
public static string get_uft8(string unicodeString)
{
string keyword;
byte[] buffer = Encoding.GetEncoding("GB2312").GetBytes(unicodeString);
keyword = Encoding.UTF8.GetString(buffer);
return keyword;
//下面几个是我尝试其他的转换,没有用
//byte[] utf8 = Encoding.UTF8.GetBytes(unicodeString);
//string s3 = ""; string s3d = "";
//foreach (byte b in utf8)
//{
// //s3 += Convert.ToString(b, 16) + " ";
// s3 += string.Format("{0:X2}", b);
// s3d += b + " ";
// // toolTip1.SetToolTip(textBox6, s3d);
//}
//return s3;
//try
//{
// Encoding gb2312 = Encoding.UTF8;
// Encoding utf8 = Encoding.GetEncoding("GBK");
// byte[] unicodeBytes = gb2312.GetBytes(unicodeString);
// Console.WriteLine(unicodeBytes);
// byte[] asciiBytes = Encoding.Convert(gb2312, utf8, unicodeBytes);
// Console.WriteLine(asciiBytes);
// char[] asciiChars = new char[utf8.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
// utf8.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
// string result = new string(asciiChars);
// return result;
//}
//catch
//{
// return "";
//}
//string keyword;
//byte[] buffer = Encoding.Unicode.GetBytes(unicodeString);
//Encoding.Convert(Encoding.UTF8,Encoding.Unicode,buffer);
//keyword = Encoding.GetEncoding("GB2312").GetString(buffer);
//UTF8Encoding utf8 = new UTF8Encoding();
//Byte[] encodedBytes = utf8.GetBytes(unicodeString);
//String decodedString = utf8.GetString(encodedBytes);
//return decodedString;
}