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 看起来直观,于是动手造了一个轮子, ...
随机推荐
- HTML5 常用的结构化标签整理
一.语义化结构化标签 结构化标签优点: 1.方便浏览器处理和识别,提升了网页的质量和语义. 2.减少了大量无意义的div标签,增强代码的可读性. 结构化标签:(header,nav,body,arti ...
- kali 2.0源更新
摘自网址: 修改更新源sources.list,提高软件下载安装速度(提供Kali 2.0 更新源) - 月黑风寒 - 博客园http://www.cnblogs.com/webyihui/p/485 ...
- maven pom.xml加载不同properties配置[转]
可以参考http://www.openwebx.org/docs/autoconfig.html 1.pom.xml =========================== <!-- 不同的打包 ...
- Redis安装及主从配置(转)
一.何为Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有 ...
- Sphinx中文分词安装配置及API调用
这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...
- iOS- Could not find a storyboard named 'Main' in bundle NSBundle
1.删掉工程中main.storyboard 后要删除plist文件中对应的键值,否则会报如下错误: Could not find a storyboard named 'Main' in bundl ...
- GOF业务场景的设计模式-----策略模式
定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 策略模式代码实现 interface IStrategy { public void doSomething(); } class ...
- 到底instanceof是啥?
对Js有一定了解的盆友肯定都知道instanceof 并且还很常用,比如说用[1, 2, 3] instanceof Array 来判断是否是数组.所以我们可能会简单的以为他就是一个用来判断typeo ...
- sql中的常见的全局变量
select APP_NAME ( ) as w --当前会话的应用程序 select @@IDENTITY --返回最后插入的标识值 select USER_NAME() --返回用户数据库用户名 ...
- [AngularJS] jQuery时代
抹平浏览器差异的jQuery出现了 jQuery有什么 jQuery使得开发无刷新动态页面(AJAX)或者单页应用(SAP)变得 相当简单. 标准的HTML页面是静态的,被浏览器渲染后就产生了一个DO ...