精华内容
下载资源
问答
  • X.509公钥证书也好,电子邮件数据也好,经常要用到Base64编码,那么为什么要作一下这样的编码呢? 我们知道在计算机任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据...

    https://blog.csdn.net/ios_xumin/article/details/79609029

    X.509公钥证书也好,电子邮件数据也好,经常要用到Base64编码,那么为什么要作一下这样的编码呢?

    我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。

     

    对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。

    1.标准base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号;

    2.base64是把3个字节变成4个可打印字符,所以base64编码后的字符串一定能被4整除(不算用作后缀的等号);

    3.等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,base64要在后面添加\0凑齐3n位。为了正确还原,添加了几个\0就加上几个等号。显然添加等号的数目只能是0、1或2;

    4.严格来说base64不能算是一种加密,只能说是编码转换。使用base64的初衷。是为了方便把含有不可见字符串的信息用可见字符串表示出来,以便复制粘贴;

     

    https://www.cnblogs.com/l-yabiao/p/7173023.html

    可以得知,通过Base64编码,原来的3个字节编码后将成为4个字节,即字节增加了33.3%,数据量相应变大。

     

    展开全文
  • (六)数据传输过程中编码的问题

    千次阅读 2017-11-02 09:43:24
    数据传输编码的问题

    近来试着FTP搜索,遇到编码问题,研究了下。

    Java内部的String为Unicode编码,每个字符占两个字节。

    Java编解码方法如下:

    1. String str = "hi好啊me";  
    2. byte[] gbkBytes=str.getBytes("GBK");//将String的Unicode编码转为GBK编码,输出到字节中  
    3. String string=new String(gbkBytes,"GBK");//gbkBytes中的字节流以GBK方案解码成Unicode形式的Java字符串 

    1、表单数据的编码

    现在的问题是,在网络中,不知道客户端发过来的字节流的编码方案(发送前浏览器会对数据编码!!!各个浏览器还不一样!!!)

    解决方案如下:

    当然URLEncoder.encode(str, "utf-8")和URLDecoder.decode(strReceive,"utf-8")方法中的编码方案要一致。

    2、网址的编码

    但以上方法只适合表单数据的提交;对于URL则不行!!!原因是URLEncoder把'/'也编码了,浏览器发送时报错!!!那么,只要http://IP/子目录把http://IP/这部分原封不动(当然这部分不要有中文),之后的数据以'/'分割后分段编码即可。

    代码如下:

    1. /**  
    2.  * 对{@link URLEncoder#encode(String, String)}的封装,但不编码'/'字符,对其他字符分段编码  
    3.  *   
    4.  * @param str  
    5.  *            要编码的URL  
    6.  * @param encoding  
    7.  *            编码格式  
    8.  * @return 字符串以字符'/'隔开,对每一段单独编码以encoding编码格式编码  
    9.  * @version: 2012_01_10  
    10.  *           <p>  
    11.  *           注意:未考虑':',如直接对http://编解码,会产生错误!!!请在使用前将其分离出来,可以使用  
    12.  *           {@link #encodeURLAfterHost(String, String)}方法解决此问题  
    13.  *           <p>  
    14.  *           注意:对字符/一起编码,导致URL请求异常!!  
    15.  */ 
    16. public static String encodeURL(String str, String encoding) {  
    17.     final char splitter = '/';  
    18.     try {  
    19.         StringBuilder sb = new StringBuilder(2 * str.length());  
    20.         int start = 0;  
    21.         for (int i = 0; i < str.length(); i++) {  
    22.             if (str.charAt(i) == splitter) {  
    23.                 sb.append(URLEncoder.encode(str.substring(start, i),  
    24.                         encoding));  
    25.                 sb.append(splitter);  
    26.                 start = i + 1;  
    27.             }  
    28.         }  
    29.         if (start < str.length())  
    30.             sb.append(URLEncoder.encode(str.substring(start), encoding));  
    31.         return sb.toString();  
    32.     } catch (UnsupportedEncodingException e) {  
    33.         e.printStackTrace();  
    34.     }  
    35.     return null;  
    36. }  
    37.  
    38. /**  
    39.  * 对IP地址后的URL通过'/'分割后进行分段编码.  
    40.  * <p>  
    41.  * 对{@link URLEncoder#encode(String, String)}  
    42.  * 的封装,但不编码'/'字符,也不编码网站部分(如ftp://a.b.c.d/部分,检测方法为对三个'/'字符的检测,且要求前两个连续),  
    43.  * 对其他字符分段编码  
    44.  *   
    45.  * @param str  
    46.  *            要编码的URL  
    47.  * @param encoding  
    48.  *            编码格式  
    49.  * @return IP地址后字符串以字符'/'隔开,对每一段单独编码以encoding编码格式编码,其他部分不变  
    50.  * @version: 2012_01_10  
    51.  *           <p>  
    52.  *           注意:对字符/一起编码,导致URL请求异常!!  
    53.  */ 
    54. public static String encodeURLAfterHost(String str, String encoding) {  
    55.     final char splitter = '/';  
    56.  
    57.     int index = str.indexOf(splitter);//第一个'/'的位置  
    58.     index++;//移到下一位置!!  
    59.     if (index < str.length() && str.charAt(index) == splitter) {//检测第一个'/'之后是否还是'/',如ftp://  
    60.         index++;//从下一个开始  
    61.         index = str.indexOf(splitter, index);//第三个'/';如ftp://anonymous:tmp@g.cn:219.223.168.20/中的最后一个'/'  
    62.         if (index > 0) {  
    63.             return str.substring(0, index + 1)  
    64.                     + encodeURL(str.substring(index + 1), encoding);//如ftp://anonymous:tmp@g.cn:219.223.168.20/天空  
    65.         } else 
    66.             return str;//如ftp://anonymous:tmp@g.cn:219.223.168.20  
    67.     }  
    68.  
    69.     return encodeURL(str, encoding);  
    70.  
    71. }  
    72.  
    73. /**  
    74.  * 对IP地址后的URL通过'/'分割后进行分段编码.  
    75.  * 此方法与{@link #decodeURLAfterHost(String, String)}配对使用  
    76.  * @param str  
    77.  *            要解码的URL  
    78.  * @param encoding  
    79.  *            str的编码格式  
    80.  * @return IP地址后字符串以字符'/'隔开,对每一段单独解码以encoding编码格式解码,其他部分不变  
    81.  * @version: 2012_01_10  
    82.  *   
    83.  *           <p>  
    84.  *           注意:对字符/一起解码,将导致URL请求异常!!  
    85.  */ 
    86. public static String decodeURLAfterHost(String str, String encoding) {  
    87.     final char splitter = '/';  
    88.     int index = str.indexOf(splitter);//第一个'/'的位置  
    89.     index++;//移到下一位置!!  
    90.     if (index < str.length() && str.charAt(index) == splitter) {//检测第一个'/'之后是否还是'/',如ftp://  
    91.         index++;//从下一个开始  
    92.         index = str.indexOf(splitter, index);//第三个'/';如ftp://anonymous:tmp@g.cn:219.223.168.20/中的最后一个'/'  
    93.         if (index > 0) {  
    94.             return str.substring(0, index + 1)  
    95.                     + decodeURL(str.substring(index + 1), encoding);//如ftp://anonymous:tmp@g.cn:219.223.168.20/天空  
    96.         } else 
    97.             return str;//如ftp://anonymous:tmp@g.cn:219.223.168.20  
    98.     }  
    99.  
    100.     return decodeURL(str, encoding);  
    101.  
    102. }  
    103.  
    104. /**  
    105.  * 此方法与{@link #encodeURL(String, String)}配对使用  
    106.  * <p>  
    107.  * 对{@link URLDecoder#decode(String, String)}的封装,但不解码'/'字符,对其他字符分段解码  
    108.  *   
    109.  * @param str  
    110.  *            要解码的URL  
    111.  * @param encoding  
    112.  *            str的编码格式  
    113.  * @return 字符串以字符'/'隔开,对每一段单独编码以encoding编码格式解码  
    114.  * @version: 2012_01_10  
    115.  *   
    116.  *           <p>  
    117.  *           注意:对字符/一起编码,导致URL请求异常!!  
    118.  */ 
    119. public static String decodeURL(String str, String encoding) {  
    120.     final char splitter = '/';  
    121.     try {  
    122.         StringBuilder sb = new StringBuilder(str.length());  
    123.         int start = 0;  
    124.         for (int i = 0; i < str.length(); i++) {  
    125.             if (str.charAt(i) == splitter) {  
    126.                 sb.append(URLDecoder.decode(str.substring(start, i),  
    127.                         encoding));  
    128.                 sb.append(splitter);  
    129.                 start = i + 1;  
    130.             }  
    131.         }  
    132.         if (start < str.length())  
    133.             sb.append(URLDecoder.decode(str.substring(start), encoding));  
    134.         return sb.toString();  
    135.     } catch (UnsupportedEncodingException e) {  
    136.         e.printStackTrace();  
    137.     }  
    138.     return null;  

    3、乱码了还能恢复?

    问题如下:

    貌似图中的utf-8改成iso8859-1是可以的,utf-8在字符串中有中文时不行(但英文部分仍可正确解析)!!!毕竟GBK的字节流对于utf-8可能是无效的,碰到无效的字符怎么解析,是否可逆那可不好说啊。

    测试代码如下:

    1. package tests;  
    2.  
    3. import java.io.UnsupportedEncodingException;  
    4. import java.net.URLEncoder;  
    5.  
    6. /**  
    7.  * @author LC  
    8.  * @version: 2012_01_12  
    9.  */ 
    10. public class TestEncoding {  
    11.     static String utf8 = "utf-8";  
    12.     static String iso = "iso-8859-1";  
    13.     static String gbk = "GBK";  
    14.  
    15.     public static void main(String[] args) throws UnsupportedEncodingException {  
    16.         String str = "hi好啊me";  
    17.         //      System.out.println("?的十六进制为:3F");  
    18.         //      System.err  
    19.         //              .println("出现中文时,如果编码方案不支持中文,每个字符都会被替换为?的对应编码!(如在iso-8859-1中)");  
    20.         System.out.println("原始字符串:\t\t\t\t\t\t" + str);  
    21.         String utf8_encoded = URLEncoder.encode(str, "utf-8");  
    22.         System.out.println("用URLEncoder.encode()方法,并用UTF-8编码后:\t\t" + utf8_encoded);  
    23.         String gbk_encoded = URLEncoder.encode(str, "GBK");  
    24.         System.out.println("用URLEncoder.encode()方法,并用GBK编码后:\t\t" + gbk_encoded);  
    25.         testEncoding(str, utf8, gbk);  
    26.         testEncoding(str, gbk, utf8);  
    27.         testEncoding(str, gbk, iso);  
    28.         printBytesInDifferentEncoding(str);  
    29.         printBytesInDifferentEncoding(utf8_encoded);  
    30.         printBytesInDifferentEncoding(gbk_encoded);  
    31.     }  
    32.  
    33.     /**  
    34.      * 测试用错误的编码方案解码后再编码,是否对原始数据有影响  
    35.      *   
    36.      * @param str  
    37.      *            输入字符串,Java的String类型即可  
    38.      * @param encodingTrue  
    39.      *            编码方案1,用于模拟原始数据的编码  
    40.      * @param encondingMidian  
    41.      *            编码方案2,用于模拟中间的编码方案  
    42.      * @throws UnsupportedEncodingException  
    43.      */ 
    44.     public static void testEncoding(String str, String encodingTrue,  
    45.             String encondingMidian) throws UnsupportedEncodingException {  
    46.         System.out.println();  
    47.         System.out  
    48.                 .printf("%s编码的字节数据->用%s解码并转为Unicode编码的JavaString->用%s解码变为字节流->读入Java(用%s解码)后变为Java的String\n",  
    49.                         encodingTrue, encondingMidian, encondingMidian,  
    50.                         encodingTrue);  
    51.         System.out.println("原始字符串:\t\t" + str);  
    52.         byte[] trueEncodingBytes = str.getBytes(encodingTrue);  
    53.         System.out.println("原始字节流:\t\t" + bytesToHexString(trueEncodingBytes)  
    54.                 + "\t\t//即用" + encodingTrue + "编码后的字节流");  
    55.         String encodeUseMedianEncoding = new String(trueEncodingBytes,  
    56.                 encondingMidian);  
    57.         System.out.println("中间字符串:\t\t" + encodeUseMedianEncoding + "\t\t//即用" 
    58.                 + encondingMidian + "解码原始字节流后的字符串");  
    59.         byte[] midianBytes = encodeUseMedianEncoding.getBytes("Unicode");  
    60.         System.out.println("中间字节流:\t\t" + bytesToHexString(midianBytes)  
    61.                 + "\t\t//即中间字符串对应的Unicode字节流(和Java内存数据一致)");  
    62.         byte[] redecodedBytes = encodeUseMedianEncoding  
    63.                 .getBytes(encondingMidian);  
    64.         System.out.println("解码字节流:\t\t" + bytesToHexString(redecodedBytes)  
    65.                 + "\t\t//即用" + encodingTrue + "解码中间字符串(流)后的字符串");  
    66.         String restored = new String(redecodedBytes, encodingTrue);  
    67.         System.out.println("解码字符串:\t\t" + restored + "\t\t和原始数据相同?  " 
    68.                 + restored.endsWith(str));  
    69.     }  
    70.  
    71.     /**  
    72.      * 将字符串分别编码为GBK、UTF-8、iso-8859-1的字节流并输出  
    73.      *   
    74.      * @param str  
    75.      * @throws UnsupportedEncodingException  
    76.      */ 
    77.     public static void printBytesInDifferentEncoding(String str)  
    78.             throws UnsupportedEncodingException {  
    79.         System.out.println("");  
    80.         System.out.println("原始String:\t\t" + str + "\t\t长度为:" + str.length());  
    81.         String unicodeBytes = bytesToHexString(str.getBytes("unicode"));  
    82.         System.out.println("Unicode bytes:\t\t" + unicodeBytes);  
    83.         String gbkBytes = bytesToHexString(str.getBytes("GBK"));  
    84.         System.out.println("GBK bytes:\t\t" + gbkBytes);  
    85.         String utf8Bytes = bytesToHexString(str.getBytes("utf-8"));  
    86.         System.out.println("UTF-8 bytes:\t\t" + utf8Bytes);  
    87.         String iso8859Bytes = bytesToHexString(str.getBytes("iso-8859-1"));  
    88.         System.out.println("iso8859-1 bytes:\t" + iso8859Bytes + "\t\t长度为:" 
    89.                 + iso8859Bytes.length() / 3);  
    90.         System.out.println("可见Unicode在之前加了两个字节FE FF,之后则每个字符两字节");  
    91.     }  
    92.  
    93.     /**  
    94.      * 将该数组转的每个byte转为两位的16进制字符,中间用空格隔开  
    95.      *   
    96.      * @param bytes  
    97.      *            要转换的byte序列  
    98.      * @return 转换后的字符串  
    99.      */ 
    100.     public static final String bytesToHexString(byte[] bytes) {  
    101.         StringBuilder sb = new StringBuilder(bytes.length * 2);  
    102.         for (int i = 0; i < bytes.length; i++) {  
    103.             String hex = Integer.toHexString(bytes[i] & 0xff);// &0xff是byte小于0时会高位补1,要改回0  
    104.             if (hex.length() == 1)  
    105.                 sb.append('0');  
    106.             sb.append(hex);  
    107.             sb.append(" ");  
    108.         }  
    109.         return sb.toString().toUpperCase();  
    110.     }  

    原文链接:http://cherishlc.iteye.com/blog/1343502

    展开全文
  • http与中文编码传输

    万次阅读 2012-08-12 15:01:49
    关于http与中文传输的问题,如果不解决,在实际的网络抓取的过程中会产生很多的次生的问题。...中文的传输过程具体可能是:内存unicode -> 编码阶段gbk, gb18030, utf8 -> 到urlencode ->最后

    关于http的RFC文档:http://www.w3.org/Protocols/rfc2616/rfc2616.html

    关于http与中文传输的问题,如果不解决,在实际的网络抓取的过程中会产生很多的次生的问题。理解中文传输的编码过程因而尤为重要。

    中文的传输过程具体可能是:内存中unicode -> 编码阶段gbk, gb18030, utf8 -> 到urlencode ->最后到可能的base64编码。那到底是什么机制在负责这个转换的过程呢?转换使用的是什么通道呢?

    UrlEncode:将字符串以URL编码 。  返回值:字符串。 函数种类:编码处理。比如在谷歌搜索“中国人”的时候,得到的URL如下所示:http://www.google.com.hk/search?q=%D6%D0%B9%FA%C8%CB&client=aff-360daohang&hl=zh-CN&ie=gb2312&newwindow=1,其中%D6%D0%B9%FA%C8%CB部分就是urlencode。那么这个编码的处理方式是怎么样的呢?有没有什么处理工具?



    个人尝试的方法就是:

    无论如何都把urlencode转化成Utf-8的格式进行数据传输。例如下例:id=java.net.URLEncoder.encode(id, "utf-8");

    然后再接受就可以了。urlencoder时必须合并使用的方法。

    id=java.net.URLEncoder.encode(id, "utf-8");
    response.sendRedirect("personalPage.jsp?user="+id);


    尝试成功之后,还有一种情况没有考虑到,那就是gb2312编码格式下中文字符的直接传输。能否不经过utf-8的编码来搞定参数的传递?



    附一些自己找到的资料:

    UrlEncode编码

    主要用于将字符串以URL编码,返回一个字符串。
    使用方法:
    1、ASP中的用法:Server.URLEncode(“内容”) 例如:

       <% response.write Server.UrlEncode("工具网") %>

    2、PHP中的用法:urlencode(“内容”) 例如:

       <?  echo urlencode("工具网")?>

    3、JSP中的用法:URLEncoder.encode(“内容”) 例如:

       <% java.net.URLEncoder.encode("工具网");  %>
       个人亲自尝试的中文传输方法,即只需编码,另一端无需解码:
    <%
        id=java.net.URLEncoder.encode(id, "UTF-8");
       response.sendRedirect("/index.jsp?error="+id); 
    %>
    

    4、javascript中的用法:encodeURI(“内容”) 例如:

       encodeURI("工具网");

    5、Python中的用法:

       import urllib2
       urllib2.quote("工具网")
    UrlDecode解码

    主要对字符串进行URL解码,返回已解码的字符串
    1、ASP中的用法:Server.UrlDecode(“内容”) 例如:

       <% response.write Server.UrlDecode("%E5%B7%A5%E5%85%B7%E7%BD%91") %>

    2、PHP中的用法:urldecode(“内容”) 例如:

       <? echo urldecode("%E5%B7%A5%E5%85%B7%E7%BD%91")?>

    3、JSP中的用法:URLDecoder.decode(“内容”) 例如:

       <% java.net.URLDecoder.decode("%E5%B7%A5%E5%85%B7%E7%BD%91"); %>

    4、javascript中的用法 例如:

       decodeURI("%E5%B7%A5%E5%85%B7%E7%BD%91");

    5、Python中的用法 例如:

       import urllib2
       urllib2.unquote("%E5%B7%A5%E5%85%B7%E7%BD%91")
    Gb2312及Gb2312转Utf-8编码的UrlEncode编码解码

    Unicode 与 Utf-8码间的内码规则模板为:

        原始码(16进制) UTF-8编码(二进制)
        --------------------------------------------
        0000 - 007F       0xxxxxxx 
        0080 - 07FF       110xxxxx 10xxxxxx 
        0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx   (中文字在此区间)
        ……
        --------------------------------------------

    例如:
    百度中查询“中国人”,会将中文URL参数转为Gb2312码的16进制表示,一个中文字用2个字节
    http://www.baidu.com/s?wd=%D6%D0%B9%FA%C8%CB
    Google中查询“中国人”,会将中文URL参数转为Utf-8编码的16进制表示,一个中文字用3个字节
    http://www.google.cn/search?client=opera&rls=en&q=%E4%B8%AD%E5%9B%BD%E4%BA%BA&sourceid=opera&ie=utf-8&oe=utf-8

    Objective-C 对 URL 进行 URLEncode 编码

    在为Apple的IPhone、ipad等设备开发iOS app应用程序访问 HTTP 资源时需要对 URL 进行 Encode,比如像拼出来的 http://www.baidu.com/s?wd=中国人,其中的中国人、 特殊符号&%和空格都必须进行转译才能正确访问。
    在 Java、.net 和 JS 中都有相应的 encodeURL 方法可用,在 Objective-C 语言中,你可以试下

       - (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;  

    来对完整的 URL(带请求参数的)进行编码,比如执行下面的代码:

       NSString *url=@"http://www.baidu.com/s?wd=中国人";
       NSString *encodedValue = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    上面代码转换出的 encodedValue 是:

        http://www.baidu.com/s?wd=%D6%D0%B9%FA%C8%CB

    可见,它不会转换 URL 中的 ?%& 符号,这也正常,因为它肯定分不出哪个 & 是参数的连接符号还是参数值,你可以单独编码参数,然后在拼接成 URL 之前把属性参数值中的 ?%& 等符号分别替换成相应的编码。

    base64的编码方式:

    Base64 c#加密函数 

    C#代码  收藏代码
    1. public static string Encrypt(string pToEncrypt)  
    2.       {  
    3.                       byte[] barray=System.Text.UnicodeEncoding.Unicode.GetBytes(pToEncrypt);  
    4.   
    5.           return Convert.ToBase64String(barray);  
    6.       }  

    Base64 c#解密函数 

    C#代码  收藏代码
    1. public string Decrypt(string pToDecrypt)  
    2.       {  
    3.   
    4.           byte[] mingwen = Convert.FromBase64String(pToDecrypt);  
    5.   
    6.           string str = System.Text.UnicodeEncoding.Unicode.GetString(mingwen);  
    7.   
    8.           return str;  
    9.   
    10.       }    


    加密后的字符串如果存在"/" "+" "=", 在WEB的传输过程中(含有request之类动作)会发生改变,分别对应为 
    “/” 在客户端变为 "2F" 
    "+"  ..........." " 
    "="  ..........."%3D" 
    所以在客户端对字符串解密前应该恢复为正确的base64码,下面是asp中的编码 
      
    Java代码  收藏代码
    1. str=Replace(str," ","+")  
    2. str=Replace(str,"%2F","/")  
    3. str=Replace(str,"%3D","=")  


    以下来源:

    http://blog.sina.com.cn/s/blog_70ca15d20100r1qy.html


    今天着实出了一个生产问题,抽奖项目的一个查询交易报JS错误,打不开链接。

     页面中用了:  windows.opern()方法打开一个页面,url中的参数(抽奖活动信息)包含引号,url提前结束。

    由于没有用URLEncoder,吃了亏……,下面做个小结,避免以后范同样的错误,也请各位读者引以为戒:

    URLEncoder

    网页中的表单使用POST方法提交时,数据内容的类型是 application/x-www-form-urlencoded,这种类型会:

    1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码;

    2.将空格转换为加号 (+) ;

    3.将非文本内容转换成"%xy"的形式,xy是两位16进制的数值;

    4.在每个 name=value 对之间放置 & 符号。

     

    web设计者面临的众多难题之一便是怎样处理不同操作系统间的差异性。这些差异性能引起URL方面的问题:例如,一些操作系统允许文件名中含有空格符,有些又不允许。大多数操作系统不会认为文件名中含有符号“#”会有什么特殊含义;但是在一个URL中,符号“#”表示该文件名已经结束,后面会紧跟一个fragment(部分)标识符。其他的特殊字符,非字母数字字符集,它们在URL或另一个操作系统上都有其特殊的含义,表述着相似的问题。为了解决这些问题,在URL中使用的字符就必须是一个ASCII字符集的固定字集中的元素,具体如下:

     

    1.大写字母A-Z

    2.小写字母a-z

    3.数字 0-9

    4.标点符 - _ . ! ~ * ' (和 ,)

     

          诸如字符: / & ? @ # ; $ + = 和 %也可以被使用,但是它们各有其特殊的用途,如果一个文件名包括了这些字符( / & ? @ # ; $ + = %),这些字符和所有其他字符就应该被编码。

     

          编码过程非常简单,任何字符只要不是ASCII码数字,字母,或者前面提到的标点符,它们都将被转换成字节形式,每个字节都写成这种形式:一个“%”后面跟着两位16进制的数值。空格是一个特殊情况,因为它们太平常了。它除了被编码成“ ”以外,还能编码为一个“+”。加号(+)本身被编码为+。当/ # = & 和?作为名字的一部分来使用时,而不是作为URL部分之间的分隔符来使用时,它们都应该被编码。

     

    URLEncoder的两种静态方法: 

    public static String encode(String s)

    public static String encode(String s, String encoding) throws UnsupportedEncodingException

     

    与URLEncoder 类相对应的URLDecoder 类有两种静态方法。它们解码以x-www-form-url-encoded这种形式编码的string。也就是说,它们把所有的加号(+)转换成空格符,把所有的%xx分别转换成与之相对应的字符:

    public static String decode(String s) throws Exception

    public static String decode(String s, String encoding)

    // Java 1.4 throws UnsupportedEncodingException



    以下来源:

    http://tech.sina.com.cn/s/2008-07-07/1053722241.shtml

    /*

      网页中的表单使用POST方法提交时,数据内容的类型是 application/x-www-form-urlencoded,这种类型会:

      1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码;

      2.将空格转换为加号 (+) ;

      3.将非文本内容转换成"%xy"的形式,xy是两位16进制的数值;

      4.在每个 name=value 对之间放置 & 符号。

      */

      URLEncoder类包含将字符串转换为application/x-www-form-urlencoded MIME 格式的静态方法。

      web设计者面临的众多难题之一便是怎样处理不同操作系统间的差异性。这些差异性能引起URL方面的问题:例如,一些操作系统允许文件名中含有空格符,有些又不允许。大多数操作系统不会认为文件名中含有符号“#”会有什么特殊含义;但是在一个URL中,符号“#”表示该文件名已经结束,后面会紧跟一个fragment(部分)标识符。其他的特殊字符,非字母数字字符集,它们在URL或另一个操作系统上都有其特殊的含义,表述着相似的问题。为了解决这些问题,我们在URL中使用的字符就必须是一个ASCII字符集的固定字集中的元素,具体如下:

      1.大写字母A-Z

      2.小写字母a-z

      3.数字 0-9

      4.标点符 - _ . ! ~ * ' (和 ,)

      诸如字符: / & ? @ # ; $ + = 和 %也可以被使用,但是它们各有其特殊的用途,如果一个文件名包括了这些字符( / & ? @ # ; $ + = %),这些字符和所有其他字符就应该被编码。

      编码过程非常简单,任何字符只要不是ASCII码数字,字母,或者前面提到的标点符,它们都将被转换成字节形式,每个字节都写成这种形式:一个“%”后面跟着两位16进制的数值。空格是一个特殊情况,因为它们太平常了。它除了被编码成“%20”以外,还能编码为一个“+”。加号(+)本身被编码为%2B。当/ # = & 和?作为名字的一部分来使用时,而不是作为URL部分之间的分隔符来使用时,它们都应该被编码。

      WARNING这种策略在存在大量字符集的异构环境中效果不甚理想。例如:在U.S. Windows 系统中, é 被编码为 %E9. 在 U.S. Mac中被编码为%8E。这种不确定性的存在是现存的URI的一个明显的不足。所以在将来URI的规范当中应该通过国际资源标识符(IRIs)进行改善。

      类URL并不自动执行编码或解码工作。你能生成一个URL对象,它可以包括非法的ASCII和非ASCII字符和/或%xx。当用方法getPath() 和toExternalForm( ) 作为输出方法时,这种字符和转移符不会自动编码或解码。你应对被用来生成一个URL对象的字符串对象负责,确保所有字符都会被恰当地编码。

      幸运的是,java提供了一个类URLEncoder把string编码成这种形式。Java1.2增加了一个类URLDecoder它能以这种形式解码string。这两个类都不用初始化:

      public class URLDecoder extends Object

      public class URLEncoder extends Object

      一、URLEncoder

      在java1.3和早期版本中,类java.net.URLEncoder包括一个简单的静态方法encode( ), 它对string以如下规则进行编码:

      public static String encode(String s)

      这个方法总是用它所在平台的默认编码形式,所以在不同系统上,它就会产生不同的结果。结果java1.4中,这个方法被另一种方法取代了。该方法要求你自己指定编码形式:

      public static String encode(String s, String encoding) throws UnsupportedEncodingException

      两种关于编码的方法,都把任何非字母数字字符转换成%xx(除了空格,下划线(_),连字符(?),句号(。),和星号(*))。两者也都编码所以的非ASCII字符。空格被转换成一个加号。这些方法有一点过分累赘了;它们也把“~”,“‘”,“()”转换成%xx,即使它们完全用不着这样做。尽管这样,但是这种转换并没被URL规范所禁止。所以web浏览器会自然地处理这些被过分编码后的URL。

      两中关于编码的方法都返回一个新的被编码后的string,java1.3的方法encode( ) 使用了平台的默认编码形式,得到%xx。这些编码形式典型的有:在 U.S. Unix 系统上的ISO-8859-1, 在U.S. Windows 系统上的Cp1252,在U.S. Macs上的MacRoman,和其他本地字符集等。因为编码解码过程都是与本地操作平台相关的,所以这些方法是令人不爽的,不能跨平台的。

      这就明确地回答了为什么在java1.4中这种方法被抛弃了,转而投向了要求以自己指定编码形式的这种方法。尽管如此,如果你执意要使用所在平台的默认编码形式,你的程序将会像在java1.3中的程序一样,是本地平台相关的。在另一种编码的方法中,你应该总是用UTF-8,而不是其他什么。UTF-8比起你选的其他的编码形式来说,它能与新的web浏览器和更多的其他软件相兼容。

      例子7-8是使用URLEncoder.encode( ) 来打印输出各种被编码后的string。它需要在java1.4或更新的版本中编译和运行。

      Example 7-8. x-www-form-urlencoded strings

      import java.net.URLEncoder;
      import java.net.URLDecoder;
      import java.io.UnsupportedEncodingException;
      public class EncoderTest {
      public static void main(String[] args) {
      try {
      System.out.println(URLEncoder.encode("This string has spaces","UTF-8"));
      System.out.println(URLEncoder.encode("This*string*has*asterisks","UTF-8"));
      System.out.println(URLEncoder.encode("This%string%has%percent%signs", "UTF-8"));
      System.out.println(URLEncoder.encode("This+string+has+pluses","UTF-8"));
      System.out.println(URLEncoder.encode("This/string/has/slashes","UTF-8"));
      System.out.println(URLEncoder.encode("This"string"has"quote"marks", "UTF-8"));
      System.out.println(URLEncoder.encode("This:string:has:colons","UTF-8"));
      System.out.println(URLEncoder.encode("This~string~has~tildes","UTF-8"));
      System.out.println(URLEncoder.encode("This(string)has(parentheses)", "UTF-8"));
      System.out.println(URLEncoder.encode("This.string.has.periods","UTF-8"));
      System.out.println(URLEncoder.encode("This=string=has=equals=signs", "UTF-8"));
      System.out.println(URLEncoder.encode("This&string&has&ersands","UTF-8"));
      System.out.println(URLEncoder.encode("Thiséstringéhasé non-ASCII characters","UTF-8"));
      // System.out.println(URLEncoder.encode("this中华人民共和国","UTF-8"));
    
      } catch (UnsupportedEncodingException ex) {throw new RuntimeException("
    Broken VM does not support UTF-8");
      }
      }
      }
    

      下面就是它的输出。需要注意的是这些代码应该以其他编码形式被保存而不是以ASCII码的形式,还有就是你选择的编码形式应该作为一个参数传给编译器,让编译器能据此对源代码中的非ASCII字符作出正确的解释。

      % javac -encoding UTF8 EncoderTest %

      java EncoderTest

      This+string+has+spaces

      This*string*has*asterisks

      This%25string%25has%25percent%25signs

      This%2Bstring%2Bhas%2Bpluses

      This%2Fstring%2Fhas%2Fslashes

      This%22string%22has%22quote%22marks

      This%3Astring%3Ahas%3Acolons

      This%7Estring%7Ehas%7Etildes

      This%28string%29has%28parentheses%29

      This.string.has.periods

      This%3Dstring%3Dhas%3Dequals%3Dsigns

      This%26string%26has%26ampersands

      This%C3%A9string%C3%A9has%C3%A9non-ASCII+characters

      特别需要注意的是这个方法编码了符号,“\” ,&,=,和:。它不会尝试着去规定在一个URL中这些字符怎样被使用。由此,所以你不得不分块编码你的URL,而不是把整个URL一次传给这个方法。这是很重要的,因为对类URLEncoder最通常的用法就是查询string,为了和服务器端使用GET方法的程序进行交互。例如,假设你想编码这个查询sting,它用来搜索AltaVista网站:

      pg=q&kl=XX&stype=stext&q=+"Java+I/O"&search.x=38&search.y=3

      这段代码对其进行编码:

      String query = URLEncoder.encode( "pg=q&kl=XX&stype=stext&q=+"Java+I/O"&search.x=38&search.y=3");System.out.println(query);

      不幸的是,得到的输出是:

      pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3

      出现这个问题就是方法URLEncoder.encode( ) 在进行盲目地编码。它不能区分在URL或者查询string中被用到的特殊字符(象前面string中的“=”,和“&”)和确实需要被编码的字符。由此,所以URL需要像下面这样一次只编码一块:

      String query = URLEncoder.encode("pg");
      query += "=";
      query += URLEncoder.encode("q");
      query += "&";
      query += URLEncoder.encode("kl");
      query += "=";
      query += URLEncoder.encode("XX");
      query += "&";
      query += URLEncoder.encode("stype");
      query += "=";
      query += URLEncoder.encode("stext");
      query += "&";
      query += URLEncoder.encode("q");
      query += "=";
      query += URLEncoder.encode(""Java I/O"");
      query += "&";
      query += URLEncoder.encode("search.x");
      query += "=";
      query += URLEncoder.encode("38");
      query += "&";
      query += URLEncoder.encode("search.y");
      query += "=";
      query += URLEncoder.encode("3");
      System.out.println(query);
    

      这才是你真正想得到的输出:

      pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3

      例子7-9是一个QueryString类。在一个java对象中,它使用了类URLEncoder来编码连续的属性名和属性值对,这个java对象被用来发送数据到服务器端的程序。

      当你在创建一个QueryString对象时,你可以把查询string中的第一个属性对传递给类QueryString的构造函数,得到初始string。如果要继续加入后面的属性对,就应调用方法add(),它也能接受两个string作为参数,能对它们进行编码。方法getQuery( )返回一个属性对被逐个编码后得到的整个string。

      Example 7-9. -The QueryString class

      package com.macfaq.net;
      import java.net.URLEncoder;
      import java.io.UnsupportedEncodingException;
      public class QueryString {
      private StringBuffer query = new StringBuffer();
      public QueryString(String name, String value) {
      encode(name, value);
      }
      public synchronized void add(String name, String value) {
      query.append('&');
      encode(name, value);
      }
      private synchronized void encode(String name, String value) {
      try {
      query.append(URLEncoder.encode(name, "UTF-8"));
      query.append('=');
      query.append(URLEncoder.encode(value, "UTF-8"));
      } catch (UnsupportedEncodingException ex) {
      throw new RuntimeException("Broken VM does not support UTF-8");
      }
      }
      public String getQuery() {
      return query.toString();
      }
      public String toString() {
      return getQuery();
      }
      }
    

      利用这个类,现在我们就能对前面那个例子中的string进行编码了:

      QueryString qs = new QueryString("pg", "q");
      qs.add("kl", "XX");
      qs.add("stype", "stext");
      qs.add("q", "+"Java I/O"");
      qs.add("search.x", "38");
      qs.add("search.y", "3");
      String url = "http://www.altavista.com/cgi-bin/query?" + qs;
      System.out.println(url);
    

      二、URLDecoder

      与URLEncoder 类相对应的URLDecoder 类有两种静态方法。它们解码以x-www-form-url-encoded这种形式编码的string。也就是说,它们把所有的加号(+)转换成空格符,把所有的%xx分别转换成与之相对应的字符:

      public static String decode(String s) throws Exception
      public static String decode(String s, String encoding) // Java 1.4 throws 
    UnsupportedEncodingException
    

      第一种解码方法在java1.3和java1.2中使用。第二种解码方法在java1.4和更新的版本中使用。如果你拿不定主意用哪种编码方式,那就选择UTF-8吧。它比其他任何的编码形式更有可能得到正确的结果。

      如果string包含了一个“%”,但紧跟其后的不是两位16进制的数或者被解码成非法序列,该方法就会抛出IllegalArgumentException 异常。当下次再出现这种情况时,它可能就不会被抛出了。这是与运行环境相关的,当检查到有非法序列时,抛不抛出IllegalArgumentException 异常,这时到底会发生什么是不确定的。在Sun's JDK 1.4中,不会抛出什么异常,它会把一些莫名其妙的字节加进不能被顺利编码的string中。这的确令人头疼,可能就是一个安全漏洞。

      由于这个方法没有触及到非转义字符,所以你可以把整个URL作为参数传给该方法,不用像之前那样分块进行。例如:

      String input = "http://www.altavista.com/cgi-bin/" + "query?
    pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3";
    
      try {
      String output = URLDecoder.decode(input, "UTF-8");
      System.out.println(output);
      }



    原文来自http://jishudaima.iteye.com/blog/957169

    request对象读取请求参数时默认采用的英文字符集ISO-8859-1。如果请求参数的值含有中文字符,读出的字符串将是乱码。读取含中文字符的参数值需要正确的设置request对象的字符编码。JSP页面需要在调用getParameter()方法之前,调用setCharacterEncoding()方法设置使用什么字符集。常用的表示中文的字符集有:GB2312、GBK、GB18030、BIG5、UTF-8。字符集的设置应该和发送请求的JSP页面的编码一致。

    <%@ page language="java" contentType="text/html; charset=GB18030"

    pageEncoding="GB18030"%>

    <html>

    <head>

    <title>字符编码</title>

    </head>

    <body>

    <form action="character_encoding.jsp" method="post">

    <p>姓名:<input type="text" name="name"/></p>

    <p><input type="submit" name="submit" value="提交"/></p>

    </form>

    <%

    //设置字符集语句需要放在所有getParameter()方法之前

    request.setCharacterEncoding("GB18030");

    String name = request.getParameter("name");

    if(name!=null) {

    out.println("<h2>姓名:" + name+"</h2>");

    }

    %>

    </body>

    </html>

    正确读取中文字符串的情况:

    去掉request.setCharaterEncoding("GB18030")出现乱码的情况:

    乱码



    原文链接:http://jishudaima.iteye.com/blog/957169

    一就是指定页面编码指定为<%@ page contentType="text/html; charset=gb2312"%>和<meta http-equiv="Content-Type" content="text/html; charset=gb2312">,然后request. getParameter()得到参数后通过getBytes()转码。我原来用jsp+servlet写程序时,也是这样处理,而且可行。但由于现在整个项目所有页面编码均指定为utf-8,所以全改为gb2312不太现实。 网上也有说通过添加过滤器的方式,设置request如下:request.seCharacterEncoding ("utf-8"),得到参数后通过new String(iso.getBytes("ISO-8859-1"),"utf-8")即可。尝试了一下,依旧失败。奇数乱码,偶数正常。

    二就是通过java.net.URLEncoder.encode(keywords)和decode方法来处理。在发送请求之前,先通过encode()对汉字进行编码,在处理参数时,用decode解码。如下示例:

    <%

           String paramValue = "汉字参数";

    %>

    <form method=post action="test.jsp?queryName=<%=java.net.URLEncoder.encode(paramValue ) %>">

             <input type="submit" value="提交">  

    </form>

    这种方法或许可行,但由于我用的struts框架,按此方法不好处理。

    花了一个晚上和一个上午,终于找到第三种可行的办法。通过javascript的escape来对参数进行处理后传输,再在后台调用一个模拟实现了javascript的escape和unescape方法的工具类对参数进行解码。步骤如下:

    <!--[if !supportLists]-->1.       <!--[endif]-->JSP页面,对含汉字的参数调用两次escape

    document.forms[0].action = "/query.do?act=getResult&queryValue=" + escape(escape(queryCondition));

    document.forms[0].submit();

        为何要调用两次escape,我没弄明白。测试了一下,如果只调用一次,在后台通过request. getParameter(“queryValue”)还真得不到值。

    <!--[if !supportLists]-->2.       <!--[endif]-->通过调用工具类Escape. unescape()方法进行解码得可得到中文。实在佩服写这个工具类的人。这世上真是什么强人都有。Escape如下:

    public class Escape {

           private final static String[] hex = { "00", "01", "02", "03", "04", "05",

                         "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", "10",

                         "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B",

                         "1C", "1D", "1E", "1F", "20", "21", "22", "23", "24", "25", "26",

                         "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", "30", "31",

                         "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C",

                         "3D", "3E", "3F", "40", "41", "42", "43", "44", "45", "46", "47",

                         "48", "49", "4A", "4B", "4C", "4D", "4E", "4F", "50", "51", "52",

                         "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D",

                         "5E", "5F", "60", "61", "62", "63", "64", "65", "66", "67", "68",

                         "69", "6A", "6B", "6C", "6D", "6E", "6F", "70", "71", "72", "73",

                         "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E",

                         "7F", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89",

                         "8A", "8B", "8C", "8D", "8E", "8F", "90", "91", "92", "93", "94",

                         "95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F",

                         "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA",

                         "AB", "AC", "AD", "AE", "AF", "B0", "B1", "B2", "B3", "B4", "B5",

                         "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", "C0",

                         "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB",

                         "CC", "CD", "CE", "CF", "D0", "D1", "D2", "D3", "D4", "D5", "D6",

                         "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", "E0", "E1",

                         "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC",

                         "ED", "EE", "EF", "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7",

                         "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF" };

           private final static byte[] val = { 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x01,

                         0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,

                         0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F };

           /** */

           /**

           * 编码

           *

           * @param s

           * @return

           */

           public static String escape(String s) {

                  StringBuffer sbuf = new StringBuffer();

                  int len = s.length();

                  for (int i = 0; i < len; i++) {

                         int ch = s.charAt(i);

                         if ('A' <= ch && ch <= 'Z') {

                                sbuf.append((char) ch);

                         } else if ('a' <= ch && ch <= 'z') {

                                sbuf.append((char) ch);

                         } else if ('0' <= ch && ch <= '9') {

                                sbuf.append((char) ch);

                         } else if (ch == '-' || ch == '_' || ch == '.' || ch == '!'

                                       || ch == '~' || ch == '*' || ch == '\'' || ch == '('

                                       || ch == ')') {

                                sbuf.append((char) ch);

                         } else if (ch <= 0x007F) {

                                sbuf.append('%');

                                sbuf.append(hex[ch]);

                         } else {

                                sbuf.append('%');

                                sbuf.append('u');

                                sbuf.append(hex[(ch >>> 8)]);

                                sbuf.append(hex[(0x00FF & ch)]);

                         }

                  }

                  return sbuf.toString();

           }

           /** */

           /**

           * 解码 说明:本方法保证 不论参数s是否经过escape()编码,均能得到正确的“解码”结果

           *

           * @param s

           * @return

           */

           public static String unescape(String s) {

                  StringBuffer sbuf = new StringBuffer();

                  int i = 0;

                  int len = s.length();

                  while (i < len) {

                         int ch = s.charAt(i);

                         if ('A' <= ch && ch <= 'Z') {

                                sbuf.append((char) ch);

                         } else if ('a' <= ch && ch <= 'z') {

                                sbuf.append((char) ch);

                         } else if ('0' <= ch && ch <= '9') {

                                sbuf.append((char) ch);

                         } else if (ch == '-' || ch == '_' || ch == '.' || ch == '!'

                                       || ch == '~' || ch == '*' || ch == '\'' || ch == '('

                                       || ch == ')') {

                                sbuf.append((char) ch);

                         } else if (ch == '%') {

                                int cint = 0;

                                if ('u' != s.charAt(i + 1)) {

                                       cint = (cint << 4) | val[s.charAt(i + 1)];

                                       cint = (cint << 4) | val[s.charAt(i + 2)];

                                       i += 2;

                                } else {

                                       cint = (cint << 4) | val[s.charAt(i + 2)];

                                       cint = (cint << 4) | val[s.charAt(i + 3)];

                                       cint = (cint << 4) | val[s.charAt(i + 4)];

                                       cint = (cint << 4) | val[s.charAt(i + 5)];

                                       i += 5;

                                }

                                sbuf.append((char) cint);

                         } else {

                                sbuf.append((char) ch);

                         }

                         i++;

                  }

                  return sbuf.toString();

           }

    }

    在后台文件里面生成页面链接时,如遇到中文参数时,也可调用Escape. escape()方法达

    到javascript的escape()功能。和上面一样,也是需要调用两次。示例:

           paramString += "&queryName=" + this.getQueryName() + "&queryValue="

                                       + Escape.escape(Escape.escape(this.getQueryValue()));


    资料来源:http://blog.sina.com.cn/s/blog_632bb1950100l77z.html

    http请求是以ISO-8859-1的编码来传送url的,如果页面的content-type为utf-8,那么在发送请求时,会将字符转成utf-8后进行传送.
    这样服务器收到字节流后,将它转成相应的字符,request.getParameter("user")直接得到了字符串,从字节流到字符流的转换系统帮我们做了(这就是错误来源)。

    一个字符串以什么样的编码转换成字节流,就必须以什么样的编码进行还原.因此,先把它还原成ISO8859_1的编码方式,再按照我们的方式编码,就不会出现乱码了。
    于是就有了上面注释起来的那个代码的解决方案:

    String name = new String(request.getParameter("user").getBytes("ISO8859_1"),"UTF-8");

    String name = new String(request.getParameter("user").getBytes("ISO8859_1"),"GBK");

    后面的根据charset的声明来该,如果是GBK,就改成相应的就可以了。

    如果是第一个页面输入信息提交到第二个页面显示

    在第二个页面开始的时候<%@ page contentType="text/html; charset=gb2312" %>

    将里面的charset改为charset=ISO8859_1即可。




    韩顺平对中文的讲解:

    java不是中国人写的,因而在网络传输的时候不支持中文。三种方法是:

    1、重新转码,new String(u.getBytes("iso-8895-1"), "gb2312");

    2、通过过滤器来解决问题

    3、通过配置server.xml文件来解决



    展开全文
  • 5G NR物理层信号传输过程

    万次阅读 多人点赞 2019-08-06 16:47:17
    NR物理层信号传输过程: 下面就简单介绍一下在5G物理层的信号是怎样的一个完整的传输过程,为了能有一个宏观上的概念。这里只讲procedure,不具体到很细节的内容。在学习的过程中我也有很多模糊和理解不到位的...

    NR中物理层信号传输过程:

    下面就简单介绍一下在5G中物理层的信号是怎样的一个完整的传输过程,为了能有一个宏观上的概念。这里只讲procedure,不具体到很细节的内容。在学习的过程中我也有很多模糊和理解不到位的地方,欢迎大家和我一起讨论。
    涉及到高层的这里不介绍,物理层处理的起点是MAC层传下来的TB终点是生成基带OFDM信号,然后将基带OFDM信号变成射频信号,通过天线发射出去。这个过程涉及到很多步骤,参考下面这个图。
    在这里插入图片描述

    TB到CW

    1、TB是指传输块,MAC发往物理层的组织形式,都是一些01信息。TB第一步要经过CRC循环冗余校验。CRC就是加入了一定的冗余信息以保证你的信息具有一定的检错或者纠错能力,说白了就是一种信元编码。就好像你写了一封信,正经的内容写完了,你又加了一句:“如果你收到信的时候信封被拆封了,那么说明我的信已经被别人看了,你最好给我回个电话”一样。

    2、从高层下来的TB有时会过大,那么过大的TB就要经过码块分割,分割为适合下一步处理的大小,要注意分割之后还要加CRC。

    3、分割后的码块要经过信道编码,就比如汉明码、卷积码、Turbo码、Polar码等,使得接收端可以检测或者纠正传输中发生的错误,实现了可靠传输。

    4、编码后的信号,有时太多,分给它的资源却太少或信号太少,分的资源太多,那么就要进行速率匹配,以实现信息和资源的匹配。简单说就是信息多了就扔掉一些,信息少了就重复一些。

    5、速率匹配后的码块,从一个个的单个码块又串联在一起,形成的就是码字CW(code word)。

    说白了码字codeword其实就是TB的变形。

    MIMO、OFDM实现过程

    1、此时的码字仍然是一个个的0和1,这些0和1要进行扰码操作。扰码就是将信息bit和扰码序列相乘得到新的加扰后的序列。扰码序列会根据小区ID、子帧编号和UE ID的不同而不同,在5G中,由于不再是LTE那样以子帧为单位进行调度,而是以符号为单位,所以5G中扰码序列一般不再与时域的信息有关。进行加扰的目的就是上行避免不同的UE之间的干扰,下行避免不同的小区之间的干扰。
    2、加扰后的bit要进行调制,如下图
    在这里插入图片描述
    从此从0和1的bit变为复数值。5G中多数采用QAM调制,就是用不同的幅度和相位表示不同的01 bit,在数学表达上,调制后的符号可以表示为复数值,图中的I路和Q路分别是复数值的实部和虚部。具体的调制以及为什么要进行调制可以参考另一篇文章https://blog.csdn.net/m0_45416816/article/details/96572794
    3、调制后得到的复数值信号,要进行层映射。现在的系统最多可以同时处理2个码字,也就是说前面所说的从TB到CW的这个过程,目前可以有2个这样的过程并行进行。所以在层映射的过程中,包括1个码字的映射和2个码字的映射。这里所说的1个码字或者2个码字,指定是码字流,也就是一串码字流或是两串码字流。单码字流最多可以映射到4层,双码字流最多可以映射到8层。从协议38211中直接把层映射的表格拿过来如下。从表中可以很清楚的了解层映射的方式,以单码字映射到3个层为例,映射方式就是把码字按顺序分到层1一个、层2一个、层3一个,然后又层1一个、层2一个…双码字映射方式与单码字类似,以双码字映射到7个层为例,码字流1映射到层1一个、层2一个、层3一个,然后又层1一个、层2一个… 码字流2映射到层1一个、层2一个、层3一个、层4一个,然后又层1一个、层2一个…
    在这里插入图片描述
    在这里插入图片描述
    4、层映射之后的复数值信息进行预编码,就是将各层输出的结果看做一个向量,与一个预编码矩阵相乘,得到预编码的结果就可以直接进行天线端口映射了。这部分内容可以参考38211中6.3.1.5。层映射和预编码两步合起来,其实就是为了将码字映射到各个天线端口上进行发射。这里就涉及到物理天线数和天线端口数,因为在4G和5G中,多天线系统是为了将信号除了频域分集、时域分集以外,在加入空间分集,也就是不同的信号走不同的路。物理天线数就是多天线系统中实际的天线个数,决定了空间分集的理论上限,但如果不同的物理天线所形成的“路”太近了,那么也就失去了空间分集的意义,此时不同的物理天线就是一条“路”,所以天线端口数就是实际的“路”的多少。也就是天线端口数≤物理天线数。
    5、从一个天线端口出来的一系列复数信号,每个复数信号都与一个子载波相乘,然后一系列子载波相加,就可以得到一个OFDM符号。过程可以这么描述,但在实际中,子载波也是复数信号,是一个复指数信号,根据欧拉公式,也有实部和虚部,分别是一个sin函数和一个cos函数,在设备中存在的形式其实是一张表,这张表给出了每个采样时刻每个子载波的sin函数和cos函数的幅值。天线端口的复数信号和表中的值进行相乘,所有相乘的结果再相加,就是某一个采样时刻的OFDM符号的幅值。一系列采样时刻的OFDM符号的幅值构成OFDM符号,该数字符号再经过D/A转换、功放、射频等一系列操作最终发射出去。当然后面这些都是实现上的问题。至于采样间隔具体是多少,和什么有关系,也可以参考我的另一篇文章https://blog.csdn.net/m0_45416816/article/details/98349772

    这就是宏观上物理层的信号过程的一个简单描述,每个单独的部分又有很多的知识。

    展开全文
  • 最近捣鼓数据库,当使用Navicat将Oracle的数据传输给MySQL时,如果Oracle表存在中文,则该表传输出错错误为: [ERR] 1366 - Incorrect string value: ‘\xE8\x81\x94\xE7\xB3\xBB…’ for column ...
  • 红外遥控编码传输协议

    千次阅读 2014-07-15 15:00:01
    生产厂家对红外遥控的编码做了严格的规范,目前国内外主流的红外遥控编码传输协议有十多种,如NEC、Philips RC-5、Philips RC-6、Philips RC-MM、Philips RECS80、 RCA、X-Sat、ITT、JVC、Sharp、Nokia ...
  •  + “,并且传输时使用 url encode 编码,字符串编码为含有 " %2B"。但是后端服务收到的值,有且仅有" %2B "自动解析为了" + "。服务端使用URL decode 解密,把" + " 号...
  • 粉丝不过W 数据链路层: 结点:主机、路由器 链路:网络两个结点之间的物理通道,链路的传输介质:双绞线、光纤和微波,... 数据链路:网络两个结点之间的逻辑通道,把实现控制数据传输协议的硬件和软件...
  • 网络传输过程中的字节序列问题

    千次阅读 2017-05-21 11:39:06
    在网络传输中,我们最好采用utf-8编码,这样可以完全保证传输的正确性。 大小端转换只在跨大小端平台进行传输的时候,我们才需要进行转换,如果不跨平台,则不需要转换,目前来说,Client端基本都是x86体系,如果...
  • 数据传输方式、编码技术

    千次阅读 2014-09-01 13:47:00
    数据传输方式、编码技术 模拟传输的主要优点是信道的利用率较高,但是传输过程中信号会衰减,会受到噪声干扰,且信号放大时噪声也会同时被放大。数字传输的主要优点是数字信号只取离散值,信号传输不失真,误码率...
  • 前后端交互过程中编码

    千次阅读 2016-07-25 13:32:51
    前后端交互过程中涉及的编码 Browser cilent: 首先,浏览器的设置里有设置编码格式,一般设置为UTF-8。 AJAX request: AJAX异步请求的过程中可以设置编码,contentType:"application/x-www-form-urlencoded
  • RFID数据传输常用编码格式

    千次阅读 2016-01-19 09:29:50
    射频识别系统通常使用下列编码方法的一种:反向不归零(NRZ)编码、曼彻斯特(Manchester)编码、单极性归零(UnipolarHZ)编码、差动双相(DBP)编码、米勒(Miller)编码利差动编码。通俗的说,就是用不同的脉冲...
  • MySQL的字符编码结构比较细,它大方向分为两个部分:数据存储编码和数据传输编码。上一篇讨论了数据存储编码部分,本篇讨论数据传输编码中讨论。
  • java 解决接口调用过程中编码问题

    千次阅读 2017-07-19 11:31:46
    所以,发送方的String要按照某种编码方式(如UTF-8,GBK)编码为字节序列,在网络中传输后,接收方取得这个字节序列,按照相同的编码方式将字节序列解码为String。String name = "张三";//这里默认是utf-8传输的//传输...
  • 很奇怪的事情,有页面 index.asp 为UTF-8页面,用Ajax发送参数"name="+escape("朝歌")+"&id=23" 到页面 resource.asp (gb2312)后,返回vbsEscape(“中文”)后,AJAX在unescape后居然能读出汉字,...不受编码影响(也就是
  • 数据在传输过程中最后一个1变成了0, 问接收端能否发现?若数据在传输过程中最后两个1都变成了0, 问接收端能否发现?采用CRC检验后,据链路层的传输是否就变成 了可靠的传输? 1)除数:10011 被除数:1101011011 ...
  • 基带传输的常用编码

    万次阅读 2015-11-26 10:35:00
    一、编码规则:  消息代码的1 用10或01表示;  消息代码的0分两种情况:  单个”0”在码元持续时间内不出现电平跳变,且与相邻码元的边界处也不跳变;  连”0”串在两个”0”码的边界处出现电平跳变,即”00...
  • H.264视频编码传输的QoS特性分析

    千次阅读 2011-03-23 15:38:00
    本文转自http://blog.csdn.net/fengyv/archive/2006/05/08/712985.aspx<br />  一、前言 在过去的20年里,...面向无线网络和因特网的视频图像编码传输技术已成为当今信息科学与技术的前沿课题。<br
  • 数据在网络7层传输过程

    千次阅读 2014-10-04 13:39:53
    一台计算机操作系统的网络过程包括从应用请求(在协议栈的顶部)到网络介质(底部) ,OSI参考模型把功能分成七个分立的层次。图2.1表示了OSI分层模型。    OSI七层参考模型  OSI模型的七层分别进行...
  • gbk编码文件传输json实例

    千次阅读 2014-04-03 09:30:42
    $str='此地无银三百两';... //错误信息输出到客户端,输出0表示没有错误 ?> cline.php页面输出(浏览器编码为gbk): string '此地无银三百两' (length=14) shu chu dao 客户端 0    
  • 二进制数据在基带中传输的时候,通常为了能够加大信息传输的准确度,我们都会进行编码和译码,在这个实验我们采用(5,2)线性分组码来进行编码和译码。 一个[n,k]线性分组码,是把信息划成k个码元为一段(称为...
  • 三、H.264的视频编码层的错误恢复[1,4]在H.261、H.263、MPEG-1、MPEG-2、MPEG-4,许多错误恢复工具已经得到了很好的应用:图像分割的不同形式(片、块组),I模式宏块,片和图像的内插,参考图像选择(带有和不带...
  • 在地址URL传输过程中常常需要对中文,特殊符号等进行编码,常用到的编码方式有escape()、encodeURI()、encodeURIComponent() 这三者的区别在Tyler‘s Blog的 escape()、encodeURI()、encodeURIComponent()区别...
  • 1、CRC校验:传输传输24比特信息,校验位为16位,找到相应的生成多项式,进行CRC校验。CRC校验完后,需要将校验位进行CRC mask,相应的比特见5.3.1.1-1。 2、信道编码:CRC校验完的数据发送到信道编码模块,进行咬...
  • 一、前言在过去的20年里,Internet、移动通信和多媒体通信获得了前所未有的发展,并...面向无线网络和因特网的视频图像编码传输技术已成为当今信息科学与技术的前沿课题。2003年,ISO/IEC的运动图像专家组(MPEG)与
  • 海明编码流水传输实验(计算机数据表示实验)

    千次阅读 多人点赞 2020-04-12 22:18:31
    在这里选用选择器,当无发生两位错误时,此时箭头所指的输入端为0,此时选择器选择第0位的数据输入即将01输入,常量和加法器,寄存器够成的电路实现的是x=x+01的功能,即类似于计数器。因此无发生两位错时,不需要...
  • 但目前,绝大部分的视频应用所采用的网络协议层次是RTP/UDP/IP,因此在下面的描述主要基于这个传输框架。下面首先分析NAL层的基本处理单元NALU以及它的网络封装、分割和合并的方法。1. NAL单元每个NAL单元是一个...
  • OSI参考模型下电子邮件传输过程

    千次阅读 2015-04-18 15:09:24
    在OSI参考模型下的电子邮件传输过程  电子邮件的工作过程遵循客户---服务器模式。每份电子邮件的发送都要涉及到发送方和接收方,发送发构成客户端,而接收方构成服务器。其主要用到的协议由SMTP和POP3协议。  ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 189,758
精华内容 75,903
关键字:

编码传输过程中出错