- 浏览: 679421 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (181)
- Matlab (16)
- Java (26)
- autoHotkey (4)
- openCV (1)
- C++ (50)
- PDF-XChange Viewer (2)
- 学术 (11)
- javascript (4)
- linux (11)
- SWT (9)
- latex (7)
- GAE (2)
- windows (6)
- C# (3)
- PS (20)
- JNI (4)
- latex,批处理 (0)
- 批处理 (4)
- Android (5)
- 矩阵论 (1)
- SVM (1)
- 概率图模型 (0)
- Python (12)
- Eigen (5)
- 编程题 (1)
- MKL (1)
- 神经网络 (9)
- 最优化 (2)
- 摄影 (1)
- PPT (0)
- After Effects (3)
- CUDA (3)
- caffe (0)
- MXNet (2)
- svn (1)
- R (0)
- 虚拟机 (0)
- tensorflow (7)
- theano (1)
- Keras (1)
- vim (1)
- xgboost (1)
- spark (6)
- eclipse (2)
- word2vec (0)
- hadoop (1)
- dmlc (1)
- git (0)
最新评论
-
jeffersonz:
请问大神,这个插件记录下来的脚本为什么不能再Extendscr ...
PhotoShop - 记录PS的所有操作为JavaScript代码 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道cherish ...
Eigen的编译选项;MKL的使用 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道 您好,您的工 ...
Eigen的编译选项;MKL的使用
近来试着FTP搜索,遇到编码问题,研究了下。
Java内部的String为Unicode编码,每个字符占两个字节。
Java编解码方法如下:
1、表单数据的编码
现在的问题是,在网络中,不知道客户端发过来的字节流的编码方案(发送前浏览器会对数据编码!!!各个浏览器还不一样!!!)
解决方案如下:
当然URLEncoder.encode(str, "utf-8")和URLDecoder.decode(strReceive,"utf-8")方法中的编码方案要一致。
2、网址的编码
但以上方法只适合表单数据的提交;对于URL则不行!!!原因是URLEncoder把'/'也编码了,浏览器发送时报错!!!那么,只要http://IP/子目录把http://IP/这部分原封不动(当然这部分不要有中文),之后的数据以'/'分割后分段编码即可
代码如下:
3、乱码了还能恢复?
问题如下
貌似图中的utf-8改成iso8859-1是可以的,utf-8在字符串中有中文时不行(但英文部分仍可正确解析)!!!毕竟GBK的字节流对于utf-8可能是无效的,碰到无效的字符怎么解析,是否可逆那可不好说啊。
测试代码如下:
Java内部的String为Unicode编码,每个字符占两个字节。
Java编解码方法如下:
String str = "hi好啊me"; byte[] gbkBytes=str.getBytes("GBK");//将String的Unicode编码转为GBK编码,输出到字节中 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/这部分原封不动(当然这部分不要有中文),之后的数据以'/'分割后分段编码即可
代码如下:
/** * 对{@link URLEncoder#encode(String, String)}的封装,但不编码'/'字符,对其他字符分段编码 * * @param str * 要编码的URL * @param encoding * 编码格式 * @return 字符串以字符'/'隔开,对每一段单独编码以encoding编码格式编码 * @version: 2012_01_10 * <p> * 注意:未考虑':',如直接对http://编解码,会产生错误!!!请在使用前将其分离出来,可以使用 * {@link #encodeURLAfterHost(String, String)}方法解决此问题 * <p> * 注意:对字符/一起编码,导致URL请求异常!! */ public static String encodeURL(String str, String encoding) { final char splitter = '/'; try { StringBuilder sb = new StringBuilder(2 * str.length()); int start = 0; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == splitter) { sb.append(URLEncoder.encode(str.substring(start, i), encoding)); sb.append(splitter); start = i + 1; } } if (start < str.length()) sb.append(URLEncoder.encode(str.substring(start), encoding)); return sb.toString(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } /** * 对IP地址后的URL通过'/'分割后进行分段编码. * <p> * 对{@link URLEncoder#encode(String, String)} * 的封装,但不编码'/'字符,也不编码网站部分(如ftp://a.b.c.d/部分,检测方法为对三个'/'字符的检测,且要求前两个连续), * 对其他字符分段编码 * * @param str * 要编码的URL * @param encoding * 编码格式 * @return IP地址后字符串以字符'/'隔开,对每一段单独编码以encoding编码格式编码,其他部分不变 * @version: 2012_01_10 * <p> * 注意:对字符/一起编码,导致URL请求异常!! */ public static String encodeURLAfterHost(String str, String encoding) { final char splitter = '/'; int index = str.indexOf(splitter);//第一个'/'的位置 index++;//移到下一位置!! if (index < str.length() && str.charAt(index) == splitter) {//检测第一个'/'之后是否还是'/',如ftp:// index++;//从下一个开始 index = str.indexOf(splitter, index);//第三个'/';如ftp://anonymous:tmp@g.cn:219.223.168.20/中的最后一个'/' if (index > 0) { return str.substring(0, index + 1) + encodeURL(str.substring(index + 1), encoding);//如ftp://anonymous:tmp@g.cn:219.223.168.20/天空 } else return str;//如ftp://anonymous:tmp@g.cn:219.223.168.20 } return encodeURL(str, encoding); } /** * 对IP地址后的URL通过'/'分割后进行分段编码. * 此方法与{@link #decodeURLAfterHost(String, String)}配对使用 * @param str * 要解码的URL * @param encoding * str的编码格式 * @return IP地址后字符串以字符'/'隔开,对每一段单独解码以encoding编码格式解码,其他部分不变 * @version: 2012_01_10 * * <p> * 注意:对字符/一起解码,将导致URL请求异常!! */ public static String decodeURLAfterHost(String str, String encoding) { final char splitter = '/'; int index = str.indexOf(splitter);//第一个'/'的位置 index++;//移到下一位置!! if (index < str.length() && str.charAt(index) == splitter) {//检测第一个'/'之后是否还是'/',如ftp:// index++;//从下一个开始 index = str.indexOf(splitter, index);//第三个'/';如ftp://anonymous:tmp@g.cn:219.223.168.20/中的最后一个'/' if (index > 0) { return str.substring(0, index + 1) + decodeURL(str.substring(index + 1), encoding);//如ftp://anonymous:tmp@g.cn:219.223.168.20/天空 } else return str;//如ftp://anonymous:tmp@g.cn:219.223.168.20 } return decodeURL(str, encoding); } /** * 此方法与{@link #encodeURL(String, String)}配对使用 * <p> * 对{@link URLDecoder#decode(String, String)}的封装,但不解码'/'字符,对其他字符分段解码 * * @param str * 要解码的URL * @param encoding * str的编码格式 * @return 字符串以字符'/'隔开,对每一段单独编码以encoding编码格式解码 * @version: 2012_01_10 * * <p> * 注意:对字符/一起编码,导致URL请求异常!! */ public static String decodeURL(String str, String encoding) { final char splitter = '/'; try { StringBuilder sb = new StringBuilder(str.length()); int start = 0; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == splitter) { sb.append(URLDecoder.decode(str.substring(start, i), encoding)); sb.append(splitter); start = i + 1; } } if (start < str.length()) sb.append(URLDecoder.decode(str.substring(start), encoding)); return sb.toString(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; }
3、乱码了还能恢复?
问题如下
貌似图中的utf-8改成iso8859-1是可以的,utf-8在字符串中有中文时不行(但英文部分仍可正确解析)!!!毕竟GBK的字节流对于utf-8可能是无效的,碰到无效的字符怎么解析,是否可逆那可不好说啊。
测试代码如下:
package tests; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; /** * @author LC * @version: 2012_01_12 */ public class TestEncoding { static String utf8 = "utf-8"; static String iso = "iso-8859-1"; static String gbk = "GBK"; public static void main(String[] args) throws UnsupportedEncodingException { String str = "hi好啊me"; // System.out.println("?的十六进制为:3F"); // System.err // .println("出现中文时,如果编码方案不支持中文,每个字符都会被替换为?的对应编码!(如在iso-8859-1中)"); System.out.println("原始字符串:\t\t\t\t\t\t" + str); String utf8_encoded = URLEncoder.encode(str, "utf-8"); System.out.println("用URLEncoder.encode()方法,并用UTF-8编码后:\t\t" + utf8_encoded); String gbk_encoded = URLEncoder.encode(str, "GBK"); System.out.println("用URLEncoder.encode()方法,并用GBK编码后:\t\t" + gbk_encoded); testEncoding(str, utf8, gbk); testEncoding(str, gbk, utf8); testEncoding(str, gbk, iso); printBytesInDifferentEncoding(str); printBytesInDifferentEncoding(utf8_encoded); printBytesInDifferentEncoding(gbk_encoded); } /** * 测试用错误的编码方案解码后再编码,是否对原始数据有影响 * * @param str * 输入字符串,Java的String类型即可 * @param encodingTrue * 编码方案1,用于模拟原始数据的编码 * @param encondingMidian * 编码方案2,用于模拟中间的编码方案 * @throws UnsupportedEncodingException */ public static void testEncoding(String str, String encodingTrue, String encondingMidian) throws UnsupportedEncodingException { System.out.println(); System.out .printf("%s编码的字节数据->用%s解码并转为Unicode编码的JavaString->用%s解码变为字节流->读入Java(用%s解码)后变为Java的String\n", encodingTrue, encondingMidian, encondingMidian, encodingTrue); System.out.println("原始字符串:\t\t" + str); byte[] trueEncodingBytes = str.getBytes(encodingTrue); System.out.println("原始字节流:\t\t" + bytesToHexString(trueEncodingBytes) + "\t\t//即用" + encodingTrue + "编码后的字节流"); String encodeUseMedianEncoding = new String(trueEncodingBytes, encondingMidian); System.out.println("中间字符串:\t\t" + encodeUseMedianEncoding + "\t\t//即用" + encondingMidian + "解码原始字节流后的字符串"); byte[] midianBytes = encodeUseMedianEncoding.getBytes("Unicode"); System.out.println("中间字节流:\t\t" + bytesToHexString(midianBytes) + "\t\t//即中间字符串对应的Unicode字节流(和Java内存数据一致)"); byte[] redecodedBytes = encodeUseMedianEncoding .getBytes(encondingMidian); System.out.println("解码字节流:\t\t" + bytesToHexString(redecodedBytes) + "\t\t//即用" + encodingTrue + "解码中间字符串(流)后的字符串"); String restored = new String(redecodedBytes, encodingTrue); System.out.println("解码字符串:\t\t" + restored + "\t\t和原始数据相同? " + restored.endsWith(str)); } /** * 将字符串分别编码为GBK、UTF-8、iso-8859-1的字节流并输出 * * @param str * @throws UnsupportedEncodingException */ public static void printBytesInDifferentEncoding(String str) throws UnsupportedEncodingException { System.out.println(""); System.out.println("原始String:\t\t" + str + "\t\t长度为:" + str.length()); String unicodeBytes = bytesToHexString(str.getBytes("unicode")); System.out.println("Unicode bytes:\t\t" + unicodeBytes); String gbkBytes = bytesToHexString(str.getBytes("GBK")); System.out.println("GBK bytes:\t\t" + gbkBytes); String utf8Bytes = bytesToHexString(str.getBytes("utf-8")); System.out.println("UTF-8 bytes:\t\t" + utf8Bytes); String iso8859Bytes = bytesToHexString(str.getBytes("iso-8859-1")); System.out.println("iso8859-1 bytes:\t" + iso8859Bytes + "\t\t长度为:" + iso8859Bytes.length() / 3); System.out.println("可见Unicode在之前加了两个字节FE FF,之后则每个字符两字节"); } /** * 将该数组转的每个byte转为两位的16进制字符,中间用空格隔开 * * @param bytes * 要转换的byte序列 * @return 转换后的字符串 */ public static final String bytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(bytes.length * 2); for (int i = 0; i < bytes.length; i++) { String hex = Integer.toHexString(bytes[i] & 0xff);// &0xff是byte小于0时会高位补1,要改回0 if (hex.length() == 1) sb.append('0'); sb.append(hex); sb.append(" "); } return sb.toString().toUpperCase(); } }
发表评论
-
lambda表达式
2014-08-20 21:47 1875仅作备忘,要学习还是看给的链接吧 1、C++ 中文介绍:htt ... -
利用Doxygen生成C++、Java文档
2013-04-08 16:15 4383示例程序、配置文件及doxygen常见参数文字版参见本文附件 ... -
删除citeulike导出的bib文件中的中文字符,使之能在WinEdt中读取
2012-12-06 18:57 1771在使用Citeulikehttp://citeulike.or ... -
使用jsoup分析网页
2012-12-05 16:12 2648之前用过HTMLParser,许久不更新的东西了,印象中也没那 ... -
JNI中基本类型数组的传递方法(无需拷贝数据!!!)
2012-10-23 17:11 182410、先来看一下主要用到哪些函数: GetIntArrayEle ... -
swig--在java、C#中调用c++写的DLL(以vs2012配置为例)
2012-10-02 22:06 70521、下载、安装: 到http://www.swig.org/d ... -
GAE学习笔记——静态文件、资源文件;GAE中使用velocity模板
2012-07-13 21:49 1409参考资料:https://developers.google. ... -
Google application engine 的Eclipse配置方法
2012-07-11 19:52 15151、安装google的eclipse插件 到https://d ... -
javadoc命令
2012-04-06 14:54 1357以下内容引用自(原文更全):http://hi.baidu.c ... -
java7文件夹监控
2012-04-04 11:23 2925java7的文件夹监控真是太烂了,折腾了一天,封装的差不多了, ... -
SWT学习笔记——JFace中TableViewer的使用及注意事项
2012-04-01 15:26 3374问题: 1、使用CellEditor ... -
SWT学习笔记——JFace中TableViewer的使用及注意事项
2012-04-01 14:52 0问题: 1、使用CellEditor时出现org.eclips ... -
SWT学习笔记——SWT、JFace的配置(含源代码、javadoc的获取)
2012-04-01 14:08 2436具体的可以看官方的http://wiki.eclipse.or ... -
SWT学习笔记7——组件背景图片,鼠标事件,鼠标样式
2012-03-31 11:00 3653import org.eclipse.swt.grap ... -
SWT学习笔记6——Shell相关的事件
2012-03-31 10:23 1494这里有详细的事件列表:http://blog.csdn.net ... -
SWT学习笔记5——简易的多标签文本编辑器
2012-03-30 22:18 2245import java.io.BufferedRead ... -
SWT学习笔记4——系统托盘 system tray
2012-03-30 15:59 1531import org.eclipse.swt.widg ... -
SWT学习笔记3——颜色、字体、图片
2012-03-30 09:41 5795import org.eclipse.swt.gra ... -
SWT笔记2——测试UI线程的事件处理
2012-03-29 21:36 1371import org.eclipse.swt.widg ... -
SWT笔记1,组件的关系,屏幕信息
2012-03-29 21:20 1389import org.eclipse.swt.widg ...
相关推荐
在java web中经常出现编码的问题,导致乱码的出现
近正在做一个项目,其中遇到了一个问题是java与.NET之间的通信问题。具体的问题是这样的: 客户端使用java,服务器端使用的是C#。两者之间使用基于TCP的Socket通信方式。可是,做了一个测试小例子,结果从客户端...
本程序是用java来编的,基于socket编程方式
总之,Base64编码是网络传输中常用的数据编码方式,它可以将二进制数据转换成可打印的ASCII字符串,确保数据在传输过程中的安全性。Base64.encodeBase64String方法是Java中进行Base64编码的一种便捷实现,能够轻松地...
在Java中进行视频传输可以通过网络编程技术来实现,其中包括使用Socket套接字建立网络连接、使用输入输出流读取和写入数据、使用缓冲区提高数据传输效率等。一般情况下,需要一个服务器端和一个客户端来完成视频传输...
利用哈夫曼编码进行信息通讯可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道 (即可以双向...
java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
由于计算机中的数据都是以二进制形式存储的,因此,当传输文本时,就会发生字符和字节之间的转换。字符与字节之间的转换是通过查码表完成的,将字符转成字节的过程称为编码,将字节转换成字符的过程称为解码,如果...
通过哈夫曼压缩后的数据其实就相当于加密了,我们可以把返回值用哈夫曼算法压缩得到一串的0101,然后再随便头尾补个乱码什么的值,到客户端再把乱码去除,在一定程度上就能让截获者迷惑了,而且传输的数据量也小了...
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时,降低传输成本。但是,这要求在发送端通过一个编码系统对待传送电文须预先编码,在接收须将传送来的数据进行译码。请自行设计实现一个具有初始化、...
其他程序可能是网络传输过程中的第三方盗窃者,也有可能是本地环境中存在的不良程序,如木马。在apache的下载列表旁边,我们会发现有个md5的链接,点击打开之后,会出现如下字符串:cbad484f0b02f0daf775137aeeOf4e2e...
最近实验室做了一个项目,使用jspsmartupload来实现的文件的上传下载,原来在windows平台运行的挺好,但是后来系统移植到linux平台上,结果在上传或下载的文件名中有中文时就会出现乱码。后来查了网上一些人的解决...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
sftp解决上传中文乱码,sftp.setFilenameEncoding("GBK");修改是不起作用的,修改源码后重新导出的jar包。
java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
本工具类用java实现了JavaScript escape/unescape 编码。对接建行支付以及需要向后端传输中文数据时可以使用得到
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
本文首先介绍了利用UDP协议进行视频网络传输的优点和不足。然后,根据视频网络传输的要求扩展了UDP协议,给UDP数据包定义了一个8个字节的包头结构,用来传送数据包的序列号、时戳等信息,且在发送端对传输进行光滑化...