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 看起来直观,于是动手造了一个轮子, ...
随机推荐
- python类相关
class A: def bar(self): print("BAR") self.f1() class B(A): def f1(self): print("B&quo ...
- Object Graph Serialization
http://coding-time.blogspot.com/2008/03/serialize-object-graph-to-xml-in-net.html http://trycatch.me ...
- angularjs学习笔记—工具方法
angular.bind(self, fn, args) 作用:返回一个新的函数,绑定这个函数的this指向self 参数: self:新函数的上下文对象 fn:需要绑定的函数 args:传递给函数的 ...
- json_encode详解,转义
1.json_encod基本用法:数组转字符串 <?php $arr = array (,,,,); echo json_encode($arr); ?> 以上例程会输出: {,,,,} ...
- yourphp基本语句
实例化页面代码 1.时间代码:{$vo.createtime|toDate=###,'Y-m-d H:i:s'} 2.连接:{:U('Pro/arr')},{:URL()} 如:<form ac ...
- Winform添加Label
Info from : http://www.csharpwin.com/csharpspace/6253r7952.shtml 本例子主要是介绍如何在 C#开发WinForm中加入一个组件,如果你想 ...
- thinkphp succes error跳转模板 设置
执行成功 换成自己想要的模块 下面的路径是默认的模板\ThinkPHP\Tpl\dispatch_jump.tpl D:\wamp\www\ThinkPHP\Tpl\dispatch_jump.tpl ...
- GOF业务场景的设计模式-----工厂模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 工厂方法模式 基本代码 interface IProduct { public void produ ...
- 知识梳理HTML篇
HTML 浏览器内核: IE:trident Firefox : gecko Safari/chrome : webkit Opera : presto(新 ...
- app的meta
<meta http-equiv="content-type" content="text/html; charset=UTF-8" /> < ...