如果通讯中产生了\\u4e00-\\u9fa5范围的中文的unicode代码,而不是\u4e00-\u9fa5范围的,那么c#的处理就比较麻烦了。
破解方法:
机制
它会把\\u4e00拆成部分来识别: \\ u4e00 , 神奇的是这种情况下,它会认为 u4e000是一个整体。
正则表达式
正则表达式需要如此书写: "[\\\\4e00-\\\\u9fa5]" , it works!!!虽然是两个部分。
界面显示
但问题是界面(winform)上显示的就是unicode了,这个时候为了让我们UI能够正常显示汉字,需要将\\替换为\。
貌似一个replace就能搞定,非也!
方式1:
"\\" -> \ 字符
"\" -> 报错。此路不通。
方式2:
@"\\" -> "\\\\"
@"\" -> "\\"
这个是南辕北辙。
方式3:
自定义一个算法,来完成\\到\的转换。
思路:
每个字符,实际在计算机中是一个数字。
比如 ‘1‘ ,对应的ascii码是49.对于汉字,有GB2312码,归根到底还是一个数字。一个汉字对应一个数字(通常表示的时候用16进制表示)
只要计算出,比如 \\u4e00的数字值(19968), 并将之对应到汉字即可。也就是
char hz = (char)0x4e00
接下来的问题是将"\\u4e00"变成0x4e00,代码如下:
#region 处理中文 /// <summary> /// \\u4e00-\\u9fa5 ->\u4e00-\u9fa5 /// </summary> /// <param name="val"></param> /// <returns></returns> protected static string process_cn(string val) { string ret = val; if (val.IndexOf("\\u") > -1) { int i = -1; char[] vals = new char[4]; char hz; while (ret.IndexOf("\\u") > -1) { i = ret.IndexOf("\\u"); if (i > -1 && i + 5 < ret.Length) { vals = ret.Substring(i + 2, 4).ToCharArray(); hz = (char)parseInt(vals); ret = ret.Replace("\\u" + toString(vals), hz.ToString()); } } } return ret; } /// <summary> /// char [] -> string /// 自带的报参数错误(new String/string(char[])) /// </summary> /// <param name="c"></param> /// <returns></returns> protected static string toString(char[] c) { StringBuilder sb = new StringBuilder(); sb.Append(c); return sb.ToString(); } /// <summary> /// (0x)660e -> 26126 /// </summary> /// <param name="c"></param> /// <returns></returns> protected static int parseInt(char[] c) { int n = 0; if (c.Length == 4) { n = parseInt(c[3]) + parseInt(c[2]) * 16 + parseInt(c[1]) * 16 * 16 + parseInt(c[0]) * 16 * 16 * 16; } return n; } /// <summary> /// (char)0~9a~zA~Z -> (int)0~15 /// </summary> /// <param name="c"></param> /// <returns></returns> protected static int parseInt(char c) { char[] arr1 = new char[] { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘ }; char[] arr2 = new char[] { ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘ }; for (int i = 0; i < arr1.Length; i++) { if (c == arr1[i]) return i; } for (int i = 0; i < arr2.Length; i++) { if (c == arr2[i]) return i + 10; } return -1; } #endregion