LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

C#.NET接收微信小程序的传参中文乱码了,如何解决?

freeflydom
2026年6月3日 11:0 本文热度 57

:C#.NET接收微信小程序的传参中文乱码了,如何解决?

微信小程序get 参数是car_number: %25E9%25B2%2581K9,也就是鲁K9,但是我网站的ashx页面Request值是椴並9,使用Server.UrlDecode也是这个结果,是什么原因?跟网站默认gb2312有关系吗?



你遇到的问题确实和网站默认编码(GB2312)有直接关系,但根源在于浏览器与服务器之间发生了 编码与解码的错位URL编码的重复处理

简单来说,你看到的 %25E9%25B2%2581 这个字符串,是一个已经被 编码了两次 的“鲁”字。你的服务器只正确地解开了一次,并用错误的字符集(GB2312)去解读了本应是UTF-8编码的内容,最终导致了“椴並9”这个乱码。

🧐 问题出在哪?一步一步拆解乱码的产生

为了让你更清晰地理解,我把这个过程拆解成三步:

  1. 源头:参数的两次编码

    • 你收到的 car_number: %25E9%25B2%2581K9 这个参数值,其中 %25 就是百分号 % 本身经过URL编码后的结果。这意味着,“鲁”字(它的UTF-8编码是 E9 B2 81)在被你看到之前,很可能经历了两次URL编码:

      • 第一次编码(正常):“鲁” → UTF-8字节 E9 B2 81 → URL编码为 %E9% B2%81

      • 第二次编码(意外):将第一次编码后的结果 %E9% B2%81 又进行了一次URL编码,于是百分号 % 变成了 %25,最终得到 %25E9%25B2%2581。这种情况通常是因为在微信小程序端或某些中间件中,对参数误用了多次encodeURIComponent

  2. 服务器接收:第一次解码(URL解码)

    • ASP.NET 框架在处理 Request["car_number"] 时,会自动对参数值进行一次URL解码。这一步是自动的,无法阻止。

    • 这次解码操作,会将你参数中的 %25 解码为 %。经过这一步,你拿到的字符串 val = Request["car_number"] 实际上已经变成了 %E9% B2%81K9。这其实已经是正确的、第一次编码后的“鲁K9”了。

  3. 手动解码:第二次解码(URL解码)与编码错位

    • 你接着手动调用了 Server.UrlDecode(val)。此时 val 的值是 %E9% B2%81K9

    • Server.UrlDecode 忠实地执行了第二次URL解码,将 %E9%B2%81 这三部分解码为对应的字节:0xE90xB20x81

    • 关键的错误在这里Server.UrlDecode 默认使用什么字符集来将这些字节组合成最终的字符串呢?它取决于你的应用程序配置。如果你的网站默认编码是 GB2312,那么它就会尝试用 GB2312 编码去解析 0xE9, 0xB2, 0x81 这三个字节。

    • 在GB2312编码中,0xE9 0xB2 对应汉字“椴”,0x81 则是一个无法映射的控制字符,通常会显示为“並”之类的占位符。于是,“鲁”字就变成了“椴並”,最终结果就成了“椴並9”。

💡 如何解决?这里有几种方案

核心思路是:既然参数被编码了两次,那么就需要解码两次,并且要确保最后一次用正确的字符集(UTF-8)来解读字节。

方案一:精确控制解码过程(推荐)

这个方法最可靠,因为它能精确指定解码用的字符集,避免依赖服务器默认配置。

在你的ashx代码中,可以这样写:

csharp
// 1. 获取自动解码过一次的值,此时它是 "%E9%B2%81K9"
string partiallyDecoded = Request["car_number"]; 
// 2. 手动进行第二次URL解码,但这次要指定用UTF-8
string correctResult = System.Web.HttpUtility.UrlDecode(partiallyDecoded, System.Text.Encoding.UTF8);

System.Web.HttpUtility.UrlDecode 方法允许你传入 Encoding.UTF8 参数,这样它就能正确地将 %E9% B2%81 这三个百分号编码解释为UTF-8字节序列,并最终还原为正确的“鲁”字。

方案二:从根本上统一编码(长远之计)

这个方法可以一劳永逸地解决后续所有类似问题。

  1. 修改小程序端:检查发送请求的代码,确保 car_number 参数 只被 encodeURIComponent 一次

  2. 修改服务器端配置:在你的 web.config 文件中,找到 <system.web> 节点,添加或修改 <globalization> 配置,将请求和响应的编码统一设置为 utf-8

xml
<system.web>
    <globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" />
</system.web>

这样做之后,整个应用程序处理URL参数和响应时,都会默认使用UTF-8,能最大程度避免乱码问题。


该文章在 2026/6/3 11:00:46 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-2  粤公网安备44030602007207号