今天在对接美团订单的时候,美团通过URL的get方式推送订单数据信息,在接收订单商品列表时,传的json数组形式的值,而且里面还有中文的商品名,通过request.getParameterMap()和request.getParameter(arg0)方式接收值得时候始终为空,并且报错:
警告: Parameters: Character decoding failed. Parameter skipped. java.io.CharConversionException: isHexDigit at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:88) at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:49) at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:412) at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:394)
后来实在没办法,通过String param = request.getQueryString();进行接收值是可以的,但是需要自己进行分割,在取得detail字段时(detail就是订单商品列表字段)形式如下:
detail=[{%22app_food_code%22:%226906907501623%22,%22box_num%22:0,%22box_price%22:0,%22food_discount%22:1,%22food_name%22:%22%E7%99%BE%E4%BA%8B%E5%8F%AF%E4%B9%902L%22,%22price%22:7,%22quantity%22:1,%22sku_id%22:%226906907501623%22,%22unit%22:%22%E4%BB%BD%22},{%22app_food_code%22:%226954767413877%22,%22box_num%22:0,%22box_price%22:0,%22food_discount%22:1,%22food_name%22:%22%E5%8F%AF%E5%8F%A3%E5%8F%AF%E4%B9%902L%22,%22price%22:6.8,%22quantity%22:1,%22sku_id%22:%226954767413877%22,%22unit%22:%22%E4%BB%BD%22},{%22app_food_code%22:%226932571040748%22,%22box_num%22:0,%22box_price%22:0,%22food_discount%22:1,%22food_name%22:%22%E5%91%B3%E5%85%A8%E6%AF%8F%E6%97%A5C100%%E6%A1%83%E6%B1%81300ml%22,%22price%22:6.5,%22quantity%22:1,%22sku_id%22:%226932571040748%22,%22unit%22:%22%E4%BB%BD%22}]%20
然后我通过URLDecoder.decode(h_detail)进行转码的时候就又出了下面这个错:
java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "u9" at java.Net.URLDecoder.decode(URLDecoder.java:173)
然后就是在网上一阵狂搜,最后终于找到了一种转码方式:
参考:http://blog.csdn.net/hbzyaxiu520/article/details/5607873
主要代码如下:
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 }; 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 (ch == ' ') { // space : map to '+' sbuf.append('+'); } else if ('A' <= ch && ch <= 'Z') { // 'A'..'Z' : as it was sbuf.append((char)ch); } else if ('a' <= ch && ch <= 'z') { // 'a'..'z' : as it was sbuf.append((char)ch); } else if ('0' <= ch && ch <= '9') { // '0'..'9' : as it was sbuf.append((char)ch); } else if (ch == '-' || ch == '_' // unreserved : as it was || ch == '.' || ch == '!' || ch == '~' || ch == '*' || ch == '/' || ch == '(' || ch == ')') { sbuf.append((char)ch); } else if (ch <= 0x007F) { // other ASCII : map to %XX sbuf.append('%'); sbuf.append(hex[ch]); } else { // unicode : map to %uXXXX sbuf.append('%'); sbuf.append('u'); sbuf.append(hex[(ch >>> 8)]); sbuf.append(hex[(0x00FF & ch)]); } } return sbuf.toString(); } 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 (ch == '+') { // + : map to ' ' sbuf.append(' '); } else if ('A' <= ch && ch <= 'Z') { // 'A'..'Z' : as it was sbuf.append((char)ch); } else if ('a' <= ch && ch <= 'z') { // 'a'..'z' : as it was sbuf.append((char)ch); } else if ('0' <= ch && ch <= '9') { // '0'..'9' : as it was sbuf.append((char)ch); } else if (ch == '-' || ch == '_' // unreserved : as it was || ch == '.' || ch == '!' || ch == '~' || ch == '*' || ch == '/' || ch == '(' || ch == ')') { sbuf.append((char)ch); } else if (ch == '%') { int cint = 0; if ('u' != s.charAt(i+1)) { // %XX : map to ascii(XX) cint = (cint << 4) | val[s.charAt(i+1)]; cint = (cint << 4) | val[s.charAt(i+2)]; i+=2; } else { // %uXXXX : map to unicode(XXXX) 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); } i++; } return sbuf.toString(); }
然后直接调用:h_detail = Util.unescape(h_detail);就完成了转码,剩下的就是字符串中文乱码转码的操作了:
h_detail = new String(h_detail.getBytes("ISO-8859-1"),"UTF-8");
最后就完成了接收美团订单数据的功能。
相关推荐
NULL 博文链接:https://greemranqq.iteye.com/blog/1664126
Take Assessment: Exercise 1: Decoding Lab secret.cpp文件
I: Decoding file-resources... I: Decoding values*/* XMLs... I: Done. I: Copying assets and libs... 5.这时,在反编译工具的文件夹下会出现一个 xxx(反编译的文件夹)该文件夹内的素材资源文件就可以打开了,...
解码 说明:本方法保证 不论参数s是否经过escape()编码,均能得到正确...另外如果出现了Erro—Parameters: Character decoding failed. 请使用escape(escape(s))来处理在客户端 解码URL中的中文,默认使用UTF-8进行解码
本书《Rockable.Decoding.HTML5.2012.RETAIL》深入探讨了HTML5的核心概念和技术,为读者提供了一个全面的指南。 ##### **1.1 什么是HTML5** HTML5不仅仅是对早期HTML版本的简单升级,它还引入了许多新的特性,如...
poj 2174 Decoding Task.md
- **PTS (Presentation Time Stamp)** 和 **DTS (Decoding Time Stamp)**:分别表示数据呈现和解码的时间,用于确保正确播放顺序。 4. **音频处理** - **OpenSL ES**:Android的低级音频接口,提供更灵活的音频...
主要程序的用途说明: mainMIMO_OFDMA_2Tx.m: 主程序,设置各种参数 gendata_2Tx_SM.m: 生成原始信息数据的程序 mod_2Tx_SM_DFUSC.m:调制程序 gen_SUI_CorrCIR.m: 生成信道冲击响应...sphere_decoding.m: 球形检测算法
《统计学习方法》是李航老师的一本经典教材,它深入浅出地介绍了机器学习中的各种统计模型和技术。在第10章中,李航老师着重讲解了“隐马尔科夫模型”(Hidden Markov Model,简称HMM),这是一种在自然语言处理、...
导入包: import org.apache.commons.codec.binary.Base64; 用法可参见压缩包里的index.html commons-codec-1.5-bin\commons-codec-1.5\apidocs\index.html
4)....Fixed: Wrong passing of Boolean parameters in JSON (affects JIRA) 5)....Fixed: Wrong sorting of BugID, Count and DateTime columns in Viewer 6)....Fixed: Empty "Count" field/column is now ...
标题中的“divx(decoding).rar_divx”表明这是一个与DivX解码技术相关的压缩文件,其中可能包含用于理解和解码DivX视频格式的详细资料。DivX是一种基于MPEG-4 Part 2标准的视频编码格式,因其高质量和高压缩率而受到...
1.9.1 Hard-Input Decoding Hamming Codes . . . . . . . . . . . . . . . 35 1.9.2 Other Representations of the Hamming Code . . . . . . . . . . . . 36 An Algebraic Representation . . . . . . . . . . . . ...
apks are nothing more than a zip file containing resources and compiled java. If you were to simply unzip an apk like so, you would be left with files such as classes.dex and resources.arsc. $ unzip...
《详解Java QRCode编码解码库——jp.sourceforge.qrcode_QRCode.jar》 在现代信息技术中,二维码(Quick Response Code,简称QR Code)已经成为数据交换的重要载体,广泛应用于广告宣传、移动支付、信息检索等领域...
Ext项目Ext的插件都斗劲大,对于网页的浏览速度也是很是不容乐观的,于是就须要对所加载的js文件进行优化,此中一个办法就是对于较大的js文件可以进行紧缩。紧缩成gzjs格局,然则gzjs后缀名的文件又不克不及被浏览器...
Decoding Failed(亲测可用).md
Looking for a practical guide to CAPTCHA decoding? All About CAPTCHA’s. This eBook will teach you how to identify weaknesses and exploit CAPTCHA’s from beginning to end. Welcome to the practical ...
Contains the most recent developments of coded modulation, trellises for codes, soft-decision decoding algorithms, turbo coding for reliable data transmission and other areas. There are two new ...
本图像编码程序是JPEG编码过程的基本模式,实现了基于DCT变换的JPEG编码 ...解码主程序:decoding.m;其中对AC、DC系数分别的解码程序ACdecoding.m、DCdecoding.m PSNR.m:峰值信噪比函数 zigzag.m:Z字形扫描函数