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

时间:2024-01-14 10:55:08

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