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

2023-10-13 05:50

本文主要是介绍java web生僻字传值_关于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

对比结果截图:

9d2b42bea6fa5481a0900ab7209a9b12.png

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

范围

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

以下是C#的代码:

25199f0a12f00e6d60c87511413286ec.gif

d1451eafbd8dec9cffda2045f688c42e.gif

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 }

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

将上面C#的代码 :if (reg.IsMatch(tempStr))  改为 if (urlEnCodeStr.Length > 1)

对于GBK中包含的特殊字符都是可以顺利转换的,但是,不是GBK字符符号的转换就没法确认了。

如:符号:“-”

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

字符:"("

C# 转换结果:

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

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

时间: 06-09

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



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

相关文章

Java中的Cursor使用详解

《Java中的Cursor使用详解》本文介绍了Java中的Cursor接口及其在大数据集处理中的优势,包括逐行读取、分页处理、流控制、动态改变查询、并发控制和减少网络流量等,感兴趣的朋友一起看看吧... 最近看代码,有一段代码涉及到Cursor,感觉写法挺有意思的。注意是Cursor,而不是Consumer

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

前端知识点之Javascript选择输入框confirm用法

《前端知识点之Javascript选择输入框confirm用法》:本文主要介绍JavaScript中的confirm方法的基本用法、功能特点、注意事项及常见用途,文中通过代码介绍的非常详细,对大家... 目录1. 基本用法2. 功能特点①阻塞行为:confirm 对话框会阻塞脚本的执行,直到用户作出选择。②

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

Spring Boot 3 整合 Spring Cloud Gateway实践过程

《SpringBoot3整合SpringCloudGateway实践过程》本文介绍了如何使用SpringCloudAlibaba2023.0.0.0版本构建一个微服务网关,包括统一路由、限... 目录引子为什么需要微服务网关实践1.统一路由2.限流防刷3.登录鉴权小结引子当前微服务架构已成为中大型系统的标

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化