首页 > 代码库 > C# 基于json通讯中的中文的处理

C# 基于json通讯中的中文的处理

如果通讯中产生了\\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 

  

 

C# 基于json通讯中的中文的处理