c 传递流java 生僻字_关于C#(生僻字、繁体字)和Java的URL转码GBK后结果不一样的问题解决...

本文主要是介绍c 传递流java 生僻字_关于C#(生僻字、繁体字)和Java的URL转码GBK后结果不一样的问题解决...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

业务背景:

服务端是用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

对比结果截图:

95077e2990a000b2a35385611a1b4c6f.png

找了很久的原因都没有发现时什么问题,最后查了一下GBK字符的 范围

发现JAVA转出来是正确的,C#转出来是错误的。每个汉子字符转出GBK应该都睡四个字节码,C#中有些字转出来只有三个字符(当然每两个字符会以%拼接),盯着C#转出来的字节码和GBK进行对比,发现C#中最后一个字母有些是大于F的,看到GBK字符集中是没有最大就到F不可能有什么NMSWZ等这些字母。猜测三个字母中应该最后一个字母是需要转出16进制的。然会就试着转了一下,果然和Java的一样的。

以下是C#的代码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public static voidConvertURLGBKEnCode()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 = newStringBuilder();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 = newStringBuilder();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的问题还有待研究。

这篇关于c 传递流java 生僻字_关于C#(生僻字、繁体字)和Java的URL转码GBK后结果不一样的问题解决...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/271626

相关文章

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot