业务背景:

服务端是用Java写的,客户端的是使用C#写的,他们交互以客户端以http协议方式请求服务端,http请求方式要求URL转码为GBK。但是后来发现,服务端收到客户端提交的GBK字符,偶尔会有乱码。于是将同一个字符串分别用URL转换GBK,然后发现只有一点点不一样。
示例如下:
字符串:赟俶鎮臨釵阁紅昇號瀍業區號鋕發廠劉東區灣業區實業蘭創黃鐰甪恆
C#转码结果:
%daS%82m%e6%82%c5R%e2O%b8%f3%bct%95N%cc%96%9ee%98I%85%5e%cc%96%e4k%b0l%8fS%84%a2%96%7c%85%5e%9e%b3%98I%85%5e%8c%8d%98I%ccm%84%93%fcS%e8A%aef%90a
Java转码结果:
%DA%53%82%6D%E6%82%C5%52%E2%4F%B8%F3%BC%74%95%4E%CC%96%9E%65%98%49%85%5E%CC%96%E4%6B%B0%6C%8F%53%84%A2%96%7C%85%5E%9E%B3%98%49%85%5E%8C%8D%98%49%CC%6D%84%93%FC%53%E8%41%AE%66%90%61
对比结果截图:
找了很久的原因都没有发现时什么问题,最后查了一下GBK字符的 范围
http://blog.csdn.net/gaoqingyu/article/details/5709958
发现JAVA转出来是正确的,C#转出来是错误的。每个汉子字符转出GBK应该都睡四个字节码,C#中有些字转出来只有三个字符(当然每两个字符会以%拼接),盯着C#转出来的字节码和GBK进行对比,发现C#中最后一个字母有些是大于F的,看到GBK字符集中是没有最大就到F不可能有什么NMSWZ等这些字母。猜测三个字母中应该最后一个字母是需要转出16进制的。然会就试着转了一下,果然和Java的一样的。
以下是C#的代码:

 1 public static void ConvertURLGBKEnCode()
 2         {
 3             string str2 = "赟俶鎮臨釵阁紅昇號瀍業區號鋕發廠劉東區灣業區實業蘭創黃鐰甪恆";
 4
 5             string str = string.Empty;
 6             string urlEnCodeStr = string.Empty;
 7             Regex reg = new Regex(@"[\u4e00-\u9fa5]");//正则表达式
 8             StringBuilder sb1 = new StringBuilder();
 9             for (int i = 0; i <= str2.Length - 1; i++)
10             {
11                 string tempStr = str2[i].ToString();
12                 urlEnCodeStr = System.Web.HttpUtility.UrlEncode(tempStr, Encoding.GetEncoding("GBK"));
13
14                 // 如果是汉子的话,将URL编码过后再进行16进制转换
15                 if (reg.IsMatch(tempStr))
16                 {
17                     // 判断转码过后的字符,如果只有4位的话,代表最后一个字符需要转换成16进制行拼接
18                     if (urlEnCodeStr.Length <= 4)
19                     {
20                         StringBuilder sb = new StringBuilder();
21                         string firstStr = urlEnCodeStr.Substring(0, 3);
22                         string LastStr = urlEnCodeStr.Substring(3, 1);
23                         sb.Append(firstStr + "%");
24                         byte[] targetData = Encoding.GetEncoding("GBK").GetBytes(LastStr);
25                         for (int j = 0; j < targetData.Length; j++)
26                         {
27                             sb.Append(targetData[j].ToString("x2"));
28                         }
29                         sb1.Append(sb.ToString());
30                     }
31                     else
32                     {
33                         sb1.Append(urlEnCodeStr);
34                     }
35                 }
36                 else
37                 {
38                     sb1.Append(urlEnCodeStr);
39                 }
40             }
41
42             Console.WriteLine(sb1.ToString());
43
44             Console.ReadLine();
45         }

View Code

对于汉字中的生僻字和繁体字问题已经解决了,但是刚刚有跑一下特殊符号又郁闷了。

将上面C#的代码 :if (reg.IsMatch(tempStr))  改为 if (urlEnCodeStr.Length > 1) 对于GBK中包含的特殊字符都是可以顺利转换的,但是,不是GBK字符符号的转换就没法确认了。

如:符号:“-”

C#转换结果:“-”;   Java:“-”

字符:"("

C# 转换结果: "(",而Java跑出来的结果却是"%28",关于这个左括号我查过了,是不属于GBK中的字符,应该也不算特殊字符,应该是直接显示的,像字母和数字以及"-"等字符一样,但就是不知道为什么,Java会转换成"%28"。

关于这个不是GBK的字符,进行转换GBK的问题还有待研究。

转载于:https://www.cnblogs.com/czmzhimin/p/3776943.html

关于C#(生僻字、繁体字)和Java的URL转码GBK后结果不一样的问题解决相关推荐

  1. unicode 生僻字_生僻字打不出来怎么办?教你一招轻松应对!

    生僻字打不出来怎么办?正所谓大千世界无奇不有,有些朋友的名字总是那么的独癖,我们就算绞尽脑汁也未必能打出TA的名字,比如"日见","王莹"等生僻字,面对这样的生 ...

  2. 数据库存储解决生僻字

    一.Oracle数据库 就一般情况来说,Oracle存储中英文的字段用varchar2类型就可以了,但有些时候,遇到生僻字就不行了, 在默认字符集环境下,实现Oracle储存生僻字: 㛃.䶮-(使用n ...

  3. 生僻字用计算机怎么弹歌曲,抖音生僻字计算器乐谱 计算器弹歌曲音乐乐谱大全...

    抖音最近流行的歌曲<生僻字>大家都学会了吗?很多脸歌曲都还没学会呢,最近又出来了计算器简谱,来看看抖音生僻字计算器乐谱? 抖音生僻字计算器数字简谱: 近日,苏州90后小伙陈柯宇创作的歌曲& ...

  4. java生僻字_Android上显示生僻字的方法

    安卓5.0+是可以显示所有(8万多个)Unicode汉字的,本文介绍显示生僻汉字的方法,这个方法也适用于其它特殊字符. Unicode值在0xFFFF以下的(2万多个简体.繁体)汉字早已被广泛支持,所 ...

  5. java获取生僻字_生僻字与16进制的转换

    字符串中的生僻字在传输和存储的过程中存在着各种各样的问题,为了便于传输和存储,我们通常会把这些生僻字转换为16进制编码进行传输和存储. package com.dc.util; import java ...

  6. java校验中文姓名合法性(需要支持生僻字与分隔符·)

    背景: 国家民委等单位关于在政府管理和社会公共服务信息系统中统一姓名采集应用规范的通知 对中文姓名合法性校验时,需要支持所有GB18030中涉及到的汉字(包括生僻字),并支持部分少数民族姓名中带有分隔 ...

  7. java生僻字解决方案

    原帖见http://hi.baidu.com/xmltiger/blog/item/f86ebdec72332f4878f05591.html 有所增加内容 java应用中经常会碰到中文生僻字的输入和 ...

  8. Java中文生僻字排序

    JDK中的java.text.Collator 排序处理生僻字会失败,现引入新的Jar包进行处理. 引入icu4j进行处理,改包主要是为软件应用提供Unicode和全球化支持的一套成熟.广泛使用的C/ ...

  9. c 传递流java 生僻字_Java语言中的生僻知识

    最近有一首名叫<生僻字>的流行歌曲火遍大江南北,创作者给佶屈聱牙的生僻字,配上了优美明快的旋律,竟然让歌曲变得琅琅上口.悦耳动听起来,平时不太常见的拒人于千里之外的这些汉字也不再那么陌生, ...

最新文章

  1. .pgr照片文件解析,C++与Java存储数据差别大小端模式
  2. Android 读取xml转json,将XML转换为Android中的JSON对象
  3. qt中设置窗口左上角的图标
  4. linux 分区 var,Ubuntu下移动/var目录到单独分区后出现的一些问题
  5. CountDownLatch闭锁
  6. zabbix邮件脚本报警
  7. 红橙Darren视频笔记 builder设计模式+navigationBar导航条
  8. 2020年日历电子版(打印版)_灵感 | 快来康康——2020年的日历设计的这么有创意?...
  9. 心语收集11:我们可以经得起心脏的千疮百孔,可以接受感情的支离破碎,却不愿喝下忘情水,忘记那曾经爱过的人。...
  10. linux编译c文件for循环,Linux C 循环队列的实现
  11. 拓端tecdat|R语言中的prophet预测时间序列数据模型
  12. SQL Server性能优化(13)看懂查询计划
  13. 小程序如何上传代码到服务器,云服务器怎么上传小程序代码
  14. Byethost美国免费空间免费撸
  15. 英语听力采用计算机化考试,高考英语复习资料及听力机考特点与应对建议
  16. CentOS 8 如何更换yum源
  17. python matplotlib绘制折线图_Matplotlib实践系列:折线图完全示例
  18. 每个 iOS 开发者都应该关注的 5 个网站
  19. mysql数据库备份和恢复
  20. Linux内核配置(转)

热门文章

  1. excel生成QRCode
  2. 计算机图形学数学基础——向量点乘和叉乘
  3. CIO、CEO、COO和CFO
  4. DevOps专题 | 大型企业级监控系统设计
  5. 如何通过Terraform Associate考试并获得证书
  6. 电商“进销存”系统——进
  7. 怎么查税务的计算机代码,全国各国税局税务代码查询?
  8. 淮北师范大学计算机学院在哪个校区,淮北师范大学校区有几个 地址是什么
  9. Chronometer 计时器的实现
  10. 银发大健康争夺战:互联网+健康领域老年用户激增,阿里/京东加速布局老年健康市场