最近在项目中发现在C++程序中用Socket模拟http请求,发送中文字符,在接收端出现乱码。 虽然说传输过程中设置charset可以避免乱码,但是多次尝试后还是不能解决。
最后只好用Unicode码代替中文传输,在接收端再还原成中文。
C++程序中的中文又是一个C#程序发送过去的。 所以我干脆在C#程序中将中文转成16进制的Unicode代码发送过去。最终在前台JS代码接收到Unicode编码时将它还原成中文。
C#中将字符串转换成Unicode码:
public string StringToUnicode(string text)
{
string strUni = null;
string temp = null;
foreach (char c in text)
{
temp = string.Format("{0:x}", (int)c);
if (temp.Length < 3)
temp = "00" + temp;
strUni += "," + temp;
}
return strUni;
}
js代码中接收到Unicode代码后,还原成中文:
var str = ",623f,95f4,0031,002e,002e,002e,002e,002e,002e,005f,002d,0021,0040,0023,0026,002a"; // 所有的逗号都替换成 %u
var str1 = str.replace(/\,/g, '%u');
console.log(unescape(str1)); // unescape 函数可以将Unicode编码解析成中文。必须在四位的16进制数前加上 %u