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 

  

 

posted @ 2014-12-09 16:35  tommy.yu  阅读(1069)  评论(0编辑  收藏  举报