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通讯中的中文的处理的更多相关文章
- scrapy输出的json文件中显示中文
scrapy用-o filename.json 输出时,会默认使用unicode编码,当内容为中文时,输出的json文件不便于查看,如下图: 可以在setting.py文件中修改默认的输出编码方式,只 ...
- python3处理json文件中含有中文dumps的应用
python3的编码问题一直比较简单 内存中字符串采用unicode 存储到文件中采用utf-8 以下为str,byte互相转换的过程: str = "abc学习" str Out ...
- 网络协议 21 - RPC 协议(中)- 基于 JSON 的 RESTful 接口协议
上一节我们了解了基于 XML 的 SOAP 协议,SOAP 的 S 是啥意思来着?是 Simple,但是好像一点儿都不简单啊! 传输协议问题 对于 SOAP 来讲,比如我创建一个订单, ...
- requests(三):json请求中中文乱码处理
最近收到一个问题:json格式请求数据中有中文,导致服务端签名失败. 问题详情: 一位同学在发送json格式的post请求时,请求数据中有中文内容: {"inputCodes":[ ...
- 基于Json.NET自己实现MVC中的JsonValueProviderFactory
写了博文ASP.NET MVC 3升级至MVC 5.1的遭遇:“已添加了具有相同键的项”之后,继续看着System.Web.Mvc.JsonValueProviderFactory的开源代码. 越看越 ...
- iOS 中json解析数据出现中文乱码的问题
一般服务器的编码格式都是UTF8,这样通过json解析下来的的数据,一般中文是不会出现乱码,但是如果服务器的编码格式不是UTF8,通过json解析的数据中的中文容易出现luan乱码,怎么解决这个问题呢 ...
- PHP中json_encode后,在json字符串中依然显示中文的解决方案
<?php header("Content-Type:text/html;charset=utf-8;"); $arr = array ('Version_code'=> ...
- php 如何把中文写入json中 当json文件中还显示的是中文
/*** * 更新版本 */ function showupversionsub(){ #接受post 过来的数据 $app_type=$_POST['aap_type']; if($app_type ...
- asp.net core 基于 JSON 实现多语言
asp.net core 基于 JSON 实现多语言 Intro 上次我们提到了,微软默认提供基于资源文件的多语言本地化,个人感觉使用起来不是太方便,没有 json 看起来直观,于是动手造了一个轮子, ...
随机推荐
- 第4章 jQuery的事件和动画(1)——事件篇
jQuery扩展了JavaScript的基本事件处理机制,极大增强了事件处理能力 一. jQuery的事件 1. $(document).ready(function(){})加载方式 再次回到win ...
- Python开发【第四篇】:Python基础之函数
三元运算 三元运算(三目运算),是对简单的条件语句的缩写. ? 1 2 3 4 5 # 书写格式 result = 值1 if 条件 else 值2 # 如果条件成立,那么将 “值1” 赋值给 ...
- [Bug]IIs Cannot read configuration file due to insufficient permissions
摘要 在部署站点的时候,遇到这样的问题Cannot read configuration file due to insufficient permissions 解决办法 在服务器上部署站点,浏览的 ...
- _ATTRIBUTE__ 你知多少?
from:http://www.cnblogs.com/astwish/p/3460618.html __ATTRIBUTE__ 你知多少? GNU C 的一大特色就是__attribute__ 机制 ...
- Linux动态库的编译与使用 转载
http://hi.baidu.com/linuxlife/blog/item/0d3e302ae2384d3a5343c1b1.html Linux下的动态库以.so为后缀,我也是初次在Linux下 ...
- str_replace vs preg_replace
转自:http://benchmarks.ro/2011/02/str_replace-vs-preg_replace/ 事实证明str_replace确实比preg_replace快. If you ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- Ajax中的get和post两种请求方式的异同
Ajax中我们经常用到get和post请求.那么什么时候用get请求,什么时候用post方式请求呢? 在做回答前我们首先要了解get和post的区别. 1. get是把参数数据队列加到提交表单的A ...
- WCF 已知类型和泛型解析程序 KnownType
数据协定继承 已知类型和泛型解析程序 Juval Lowy 下载代码示例 自首次发布以来,Windows Communication Foundation (WCF) 开发人员便必须处理数据协定继承方 ...
- superF12
superF12是开发内嵌ie内核的桌面客户端时的一个调试工具