对UTF-8和GB2312格式 URL进行解码

UTF-8转GB2312编码转换工具实战详解 UTF-8(Unicode Transformation Format-8)是一种变长字符编码,能够表示Unicode标准中的所有字符,兼容ASCII,广泛用于国际化的Web和操作系统环境。其设计目标是实现高效存储与跨语言兼容,英文字符仅占1字节,中文通常占3字节。相比之下,GB2312是中国国家标准的简体中文字符集,采用固定双字节编码,收录约6763个汉字,主要用于早期中文信息处理系统。它不兼容Unicode,且扩展能力有限,适用于纯中文环境但难以支持多语言共存。 阅读详情

对UTF-8和GB2312格式 URL进行解码

新的系统编码格式是:UTF-8  
老的页面编码格式是: GB2312 
新的系统的URL参数(带中文) 提交到老的系统中,中文参数是乱码。


解决思路1,在新的系统中传递的时候使用JS进行解码,然后再编码。这种方案,和浏览器本身传参无区别。所以,在使用这种方案后,在老的系统中解码,依然解决不了问题。

简单写一下实现的伪代码

传参的时候,使用JS 编码:
location.href="old.aspx?word="+encodeURI('中文')

老的页面解码:
 Server.UrlDecode(Request["word"]);

最终还是乱码。

最终看了一下编过的汉字:“中文”

UTF-8下:

JS编码过的如下:               %E4%B8%AD%E5%9B%BD

浏览器FORM提交的如下:%E4%B8%AD%E5%9B%BD

GB2312:

JS编码格式如下:              %E4%B8%AD%E5%9B%BD

浏览器FORM提交的如下:%D6%D0%B9%FA

说明,使用JS编码模式都是将字符串用UTF-8模式下编码。

如果这样子的话,那我使用JS编码传参,后台都采用UTF-8进行解码就可以了。(这种思路未测试,我自己使用的是思路2)

HttpUtility.UrlDecode(strEncode, Encoding.UTF8); //判断编码格式 UTF-8

解决思路2,

既然是解码的问题,那我就要针对传过来的的字符串进行判断,然后进行相应的格式进行解码。

(1).判断其编码格式。

(2).再解码。

代码如下:

    //string strEncode =Request["word"];  //解码的时候这样子获取参数是有问题的,这样获取参数,无论怎么转都是乱码。应用下面的这种方式
    string strEncode =GetWord( Request.ServerVariables["QUERY_STRING"]);
 
 if (IsUTF8(strEncode)) result = HttpUtility.UrlDecode(strEncode, Encoding.UTF8); //判断编码格式 UTF-8
else result = HttpUtility.UrlDecode(strEncode, Encoding.GetEncoding("GB2312")); ////判断编码格式 GB2312

    /// <summary>
    /// 获取word参数
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    private string GetWord(string value)
    {
        if (string.IsNullOrEmpty(value)) return "";
        string[] array = value.Split('&');
        string strEncode = "";
        for (int i = 0; i < array.Length; i++)
        {
            if (array[i].IndexOf("word=") >= 0)
            {
                strEncode = array[i].Replace("word=", "");
                break;
            }
        }
        return strEncode;
    }

    /// <summary>
    /// 获取字符的字节
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    private static byte[] GetUrlCodingToBytes(string url)
    {
        StringBuilder sb = new StringBuilder();

        int i = url.IndexOf('%');
        while (i >= 0)
        {
            if (url.Length < i + 3)
            {
                break;
            }
            sb.Append(url.Substring(i, 3));
            url = url.Substring(i + 3);
            i = url.IndexOf('%');
        }

        string urlCoding = sb.ToString();
        if (string.IsNullOrEmpty(urlCoding))
            return new byte[0];

        urlCoding = urlCoding.Replace("%", string.Empty);
        int len = urlCoding.Length / 2;
        byte[] result = new byte[len];
        len *= 2;
        for (int index = 0; index < len; index++)
        {
            string s = urlCoding.Substring(index, 2);
            int b = int.Parse(s, System.Globalization.NumberStyles.HexNumber);
            result[index / 2] = (byte)b;
            index++;
        }
        return result;
    }

    /// <summary>
    /// 判断字符是否为UTF-8
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    private static bool IsUTF8(string url)
    {
        byte[] buf = GetUrlCodingToBytes(url);
        int i;
        byte cOctets; // octets to go in this UTF-8 encoded character  
        bool bAllAscii = true;
        long iLen = buf.Length;
        cOctets = 0;
        for (i = 0; i < iLen; i++)
        {
            if ((buf[i] & 0x80) != 0) bAllAscii = false;

            if (cOctets == 0)
            {
                if (buf[i] >= 0x80)
                {
                    do
                    {
                        buf[i] <<= 1;
                        cOctets++;
                    }
                    while ((buf[i] & 0x80) != 0);

                    cOctets--;
                    if (cOctets == 0)
                        return false;
                }
            }
            else
            {
                if ((buf[i] & 0xC0) != 0x80)
                    return false;
                cOctets--;
            }
        }
        if (cOctets > 0)
            return false;
        if (bAllAscii)
            return false;
        return true;
    }

2012-8-3 16:20 

 今天,遇到一个问题,MVC项目中,一个AJAX请求的问题,又是乱码。肯定又是编码的东西,搞的人难受。其实很简答,一个文本框,输入一个值。AJAX请求一下,看是否存在,如果存在就清空。看前任写的代码,


 function checkUnitName(unitName) {
            if (unitName != "") {
                $.get("/Manage/Product/CheckUnitName", { pUnitName: encodeURI(unitName) }, function (data) {
                    if (data == "0") {
                        alert("单位名称已经存在,请选择");
                        $("#UnitName").val("");
                    }
                });
            }
        }


     public static string UNEscape(string str)
        {
            string outstr = "";
            #region 老方法
            if (!string.IsNullOrEmpty(str))
            {
                string[] strlist = str.Replace("%", "").Split('u');
                try
                {
                    for (int i = 1; i < strlist.Length; i++)
                    {
                        //将unicode字符转为10进制整数,然后转为char中文字符
                        outstr += (char)int.Parse(strlist[i].Substring(0, 4), System.Globalization.NumberStyles.HexNumber);
                    }
                }
                catch (FormatException ex)
                {
                    outstr = ex.Message;
                }
            }
            #endregion

            return outstr;
        }

这个方法基本没派上用场,执行过后,返回为 空字符串。

其实就这一句话就搞定了。

        public static string UNEscape(string str)
        {
            string outstr =  outstr = HttpUtility.UrlDecode(str, Encoding.UTF8);
            return outstr;
        }

问题点是:

AJAX乱码问题

 从网上查资料得知,
1、xtmlhttp 返回的数据默认的字符编码是utf-8, 
2、post方法提交数据默认的字符编码是utf-8, (get也是的,自己就是使用get方式)


因为我这个项目是使用GB2312的编码格式,AJAX (UTF-8)  的模式传到后台,就会出现乱码了。明白了其中的道理,问题就好解决了。





        


js gb2312编解码 直接打包省掉 很多麻烦 开包及用 编码 var s = $url.ecode(m); 解码 var m = $url.ecode(s); 立即下载

相关推荐

IBM 3560M3 R5 坏盘更换记录

公司一台老旧 3650M3在日常巡查过程中发现硬盘报错

ddriv的博客 3941

前端实现字符串GBK与GB2312的编解码

前言 在开发项目的时候遇到的一个比较坑的问题,产品要求从浏览器拿到浏览器地址栏里面的搜索词进行判断,我们一般使用的都是UTF-8的编码格式,但是百度和谷歌在对搜索词编码的时候都是使用的GBK编码,这就导致,解码失败,于是就在网上找解决方法,最终找到了一位前辈整理出来的方法,通过iframe解决了这个问题,所以特此总结一下,方便自己以后使用,也希望能帮助到更多的人,最后会放上前端文章的链接。 1、编码(支持GBK和GB2312) 为了避免麻烦,我们可以将表单的请求页面设定为当前页面,将回调函数放在页面JS的.

arvin的博客 3257

金蝶云星空API实战:从零到一,用Postman打通业务数据流

本文详细介绍了如何使用Postman调试金蝶云星空API,从创建第三方应用到实战调试技巧,帮助开发者快速打通业务数据流。文章重点讲解了API配置的关键细节、常见问题排查方法以及自动化测试方案,提升开发效率与准确性。

weixin_33712987的博客 518

Gb2312及Gb2312转Utf-8编码的UrlEncode编码解码(全)

为了一个gb2312下post中文参数到utf-8页面的程序,随闷的难受,查了一下午资料,大部分是讲Gb2312传到Gb2312页面的UrlEncode,没有提供到Utf-8页面的UrlEncode,后来找到Unicode转Utf-8码的资料,参考之下,终于写出了Utf-8的UrlEncode,这里整理下各种UrlEncode方法,供有需要的朋友参考。详细Utf-8编码规则请百度一下。Un

思科网络 3606

鸿蒙OS+UniApp文件上传实战:如何解决大文件分片上传的3大坑?

本文深入探讨鸿蒙OS与UniApp结合实现大文件分片上传的实战方案,重点解决分片策略设计、网络中断处理和进度管理三大技术难题。通过鸿蒙分布式特性与UniApp跨平台能力的结合,提供动态分片调整、断点续传和跨设备进度同步等优化方案,显著提升大文件上传成功率和用户体验。

weixin_29250403的博客 474

编码解码UTF-8,gb2312等百分号编码进行解码示例

首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责     uft-8 及 gb2312对 数据编码时,保留 字符和数字的anscii 编码方法,但对汉字及特殊字符进程 百分号编码。其中utf-8中一个 汉字 占3个字节,gb2312 中占2个字节。     例如 "三"    停止utf-8 百分号编码,生成%E4%B8%89     在解码时,需加%后的2位16进制数转换为整数,...

weixin_33709364的博客 653

控制科学与工程(自动化)保研经验【4】——浙大篇

控制科学与工程(自动化)保研经验【4】——浙大篇

Control Everything 1万+

UTF-8编码 与 URL 解析

UCS-2和UCS-4编码很难在许多当前的应用和协议中使用,这些应用和协议假定字符为一个8或7比特的字节。即使新的可以处理16比特字符的系统,却不能处理UCS-4数据。这种情况导致一种称为UCS转换格式(UTF)的发展,它每一种有不同的特征。 UTF-8(RFC 2279),使用了8比特字节的所有位,保持全部US-ASCII取值范围的性质:US-ASCII字符用一个8比特字节编码,采用通常的US-

To be better everyday 1709

RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试

Rockchip RK3588 是一款高性能的处理器,支持多种摄像头接口,包括 MIPI(Mobile Industry Processor Interface)接口。MIPI是一种用于移动设备和嵌入式系统中的摄像头、显示器和其他传感器设备的串行接口标准。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准。CSI-2(Camera Serial Interface 2)是MIPI 联盟定义的另一种高速接口,主要用于摄像模组和处理器之间的连接。

flypig has a dream! 6861

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

算法如诗的博客 5585

C/C++ 字符编码的转换(ut8、gb2312)

有三分代码 strCoding.h strCoding.cpp test.cpp ******************************************************************************************************************************* [cpp] view plain...

weixin_30443075的博客 113

Python爬虫实战:逆向工程与异步处理攻克Pinterest无限滚动瀑布流

我们将从零开始,逐步分析其数据接口,构建一个功能完整的爬虫,并深入探讨反爬虫策略的应对、性能优化以及数据存储等高级主题。: 在实际爬取中,你需要先访问一次Pinterest主页,获取初始的Cookie和CSRF Token,然后再发起API请求。: Python爬虫,Pinterest,无限滚动,瀑布流,异步IO,httpx,逆向工程,API接口,动态内容,反爬虫。你会很快发现一些关键的请求模式。:页面初始加载有限内容,随着用户滚动,新的图片块通过AJAX动态加载,实现“永无止境”的浏览。

2201_76125261的博客 551

3.2 Java编解码场景及实现

篇幅还是较长,不知道怎么来分割,索性就一起了 在阅读的过程中,一定要不忘初心(想想为什么学编解码) 正片开始 Java的编解码具体实现 ​ 这里将以实际例子介绍 Java 中如何实现编码及解码,下面我们以“I am 君山”这个字符串为例介绍 Java 中如何把它以 ISO-8859-1、GB2312、GBK、UTF-16、UTF-8 编码格式进行编码的。(书的作者笔名是“君山”) String ...

qq_44932672的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

url带中文参数显示乱码的问题

最近要上个项目,其实很简单的东西,就是拼接一个url,不过url中的参数需要UrlEncode编码的,其实对我来说,这个问题很好解决,C#用HttpUtility.UrlEncode来进行编码,asp用Server.UrlEncode来进行编码。问题解决了吗?问题刚刚开始因为这个公用转向文件,是针对所有分站的,分站代码有.net和asp两种,文件编码格式也不一样。头大的事情开始了。asp站的文件编

lne818的专栏 3475

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java utf-8_Java 字符编码工具类 [UTF-8 编码实现]

import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.net.URLDecoder;/***Title:字符编码工具类*Description:*Copyright: flashman.com.cn Copyright (c) 2005*Company: flashman.com.cn*...

weixin_33389398的博客 1301

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++类URL编码和解码使用技巧

在项目开发过程中,经常会使用到c++ 的url编码和解码,本文将以此问题详细介绍使用技巧,需要的朋友可以参考下 #pragma once  #include   #include   #include   using namespace std;  class strCoding  {  public:  strCoding(void);  ~strCoding(voi

xiaofei0859的专栏 661

java 百分号编码工具类_JAVA 对 URL 进行 编码与解码

import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.net.URLDecoder;/*** Title:字符编码工具类 * Description: * Copyright: flashman.com.cn Copyright (c) 2005* Company: flashman....

weixin_36337502的博客 374

利用百度进行URL编码解码

以后大家在碰到解析URL编码的时候就不用在从网上下载工具了 利用百度就可以了哈 是这样的 http://www.baidu.com/s?wd=(“=”号后面输入你要解码的URL编码,这样是用默认的是GB2312编码解析) 像这样http://www.baidu.com/s?wd=%ba%da%bf%cd 就会直接显示解码后的数据哦【在搜索框里】 同样的,如果是ut...

weixin_33910137的博客 1059

linux+apache+c cgi总结4表单URL处理

在上面,我们一直用的是英文,作为中国人,干什么事都用英文是让人很难受的,所以接下来我们要用中文了,不知道会不会同样顺利? 提交后的效果为 与想想中的不一样吧,刚开始我也很震惊,美丽的汉字"祖国你好"竟然全成了‘%’,字母和数字。说他是乱码吧,他还有点规律,不是乱码却又看不懂。这其实涉及到了url的一个编码与转码问题。在url编码中任何特殊的字符(就是那些不是简单的七位ASCII

#维多利亚的秘密# 972

java 字符流 乱码_java的io流基础篇乱码的原因

1.编码的产生:我们的存储的基本单元是一个byte字节,然而人类的语言太多,无法用一个基本单元来表示,然而为了拆分或者一些相应的翻译工作,导致了编码的产生2.常见的编码格式ASCll :用一个字节的低7位共128个来表示,0-31表示控制字符,32-126表示打印字符, ASCll的二进制第一位也就是最高位,目的是用来做奇偶检验的,所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,...

weixin_32365483的博客 1117

C# 中文在URL中的编码

正在研究一个程序,输入一个关键字,能够把这个关键字发送到Google,yahoo等搜索引擎,进行搜索,然后打开结果网页。原理很简单。比如在Google搜索China,搜索结果页面的URL就是“http://www.google.com/search?hl=zh-CN&q=China&lr=”。只要替换红颜色的内容,就可以按照不同的关键字搜索。 但是如果关键字是中文,就会出现问题。比如在google

7398

如何自动判断url中汉字的编码格式

参考了http://topic.youkuaiyun.com/u/20091105/15/0d54b7b2-38fe-4cdf-ae1b-5a1f07c26ea0.html帖子18楼的代码 修改了一下,满足了我实际的项目需求 usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text...

weixin_30387663的博客 76
上一篇: 两道SQL面试题
下一篇: asp.net的Request.ServerVariables参数说明
七色鸟
博客等级 码龄15年 35粉丝 100原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值