Java字符编码问题
今天研究了一下,记录下来
中间用的是redis,可以使用任意其他的io替代,一样的
Test1
String s1 = "我要测试";
String s2 = "I want to test";
String s3 = "경쟁력, 네이버";
redis.lpush("testencode", s1);
redis.lpush("testencode", s2);
redis.lpush("testencode", s3);
System.out.println(redis.lpop("testencode"));
System.out.println(redis.lpop("testencode"));
System.out.println(redis.lpop("testencode"));
结果:全部正确
注解:Java内部也是unicode,所以如果发送和接受端都是Java写的,无需任何转码(前提是发送和接受端的默认编码一致)
Java在往I/O发送和从I/O接受的时候会默认转码,一般用系统默认的编码,貌似文档本身的编码格式优先级更高
所以这里发送到时候转成utf-8,接受时再从utf-8转回unicode,所以没有问题
Test2
String s1 = "我要测试";
byte[] key = "testencode".getBytes();
byte[] b1 = s1.getBytes("gb2312"); //自己转码,而非默认转码
redis.lpush(key, b1);
System.out.println(new String(redis.lpop(key),"gb2312"));
//System.out.println(new String(redis.lpop(key)));
结果:正确
注解:由于发送的时候已经转成gb2312,所以接受的时候,必须转回来,如果用默认的(注释掉部分)就会转成默认编码utf-8,就会乱码
前面的转码都是在知道原编码的情况下,但有时在接收端无法知道原来的编码,这是就需要detect编码
使用JCharDet,这个的接口写的不好,蛮难用的
参考,http://blog.csdn.net/chenvsa/article/details/7445569
我改了一下,
import org.mozilla.intl.chardet.nsDetector;
import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
import org.mozilla.intl.chardet.nsPSMDetector;
public class CharsetDetector{
private boolean found = false;
private String result;
private int lang = nsPSMDetector.ALL;
public String[] detectCharset(byte[] bytes) throws IOException
{
String[] prob;
// Initalize the nsDetector() ;
nsDetector det = new nsDetector(lang);
// Set an observer...
// The Notify() will be called when a matching charset is found.
det.Init(
new nsICharsetDetectionObserver(){
public void Notify(String charset)
{
found = true;
result = charset;
}
});
int len = bytes.length;
boolean isAscii = true;
if (isAscii){
isAscii = det.isAscii(bytes, len);
}
// DoIt if non-ascii and not done yet.
if (!isAscii){
if (det.DoIt(bytes, len, false));
}
det.DataEnd();
if (isAscii){
found = true;
prob = new String[] {"ASCII"};
} else if (found){
prob = new String[] {result};
} else {
prob = det.getProbableCharsets();
}
return prob;
}
public String[] detectChineseCharset(byte[] bytes) throws IOException
{
try{
lang = nsPSMDetector.CHINESE;
return detectCharset(bytes);
} catch (IOException e){
throw e;
}
}
使用,
CharsetDetector cd = new CharsetDetector();
String[] probableSet = {};
try {
probableSet = cd.detectChineseCharset(b1);
} catch (IOException e) {
e.printStackTrace();
}
for (String charset : probableSet)
{
System.out.println(charset);
}
Java字符编码问题的更多相关文章
- 【字符编码】Java字符编码详细解答及问题探讨
一.前言 继上一篇写完字节编码内容后,现在分析在Java中各字符编码的问题,并且由这个问题,也引出了一个更有意思的问题,笔者也还没有找到这个问题的答案.也希望各位园友指点指点. 二.Java字符编码 ...
- Java 字符编码归纳总结
String newStr = new String(oldStr.getBytes(), "UTF-8"); java中的String类是按照unicode进行编码的 ...
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...
- 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- Java 字符编码(二)Java 中的编解码
Java 字符编码(二)Java 中的编解码 java.nio.charset 包中提供了一套处理字符编码的工具类,主要有 Charset.CharsetDecoder.CharsetEncoder. ...
- Java 字符编码(三)Reader 中的编解码
Java 字符编码(三)Reader 中的编解码 我们知道 BufferedReader 可以将字节流转化为字符流,那它是如何编解码的呢? try (BufferedReader reader = n ...
- Java 字符编码(一)Unicode 字符编码
Java 字符编码(一)Unicode 字符编码 Unicode(http://www.unicode.org/versions/#TUS_Latest_Version) 是一个编码方案,说白了希望给 ...
- java字符编码详解
引用自:http://blog.csdn.net/jerry_bj/article/details/5714745 GBK.GB2312.iso-8859-1之间的区别 GB2312,由中华人民共和国 ...
- JAVA字符编码三:Java应用中的编码问题
第三篇:JAVA字符编码系列三:Java应用中的编码问题 这部分采用重用机制,引用一篇文章来完整本部分目标. 来源: Eceel东西在线 问题研究--字符集编码 地址:http://china.e ...
随机推荐
- linux -- ubuntu 通过命令行,设置文件及其子文件的权限
想一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-R表示启动递归处理. 例如: [root@localhost ~]# chmod 777 /home/user 注:仅把 ...
- erlang -- ios apns provider -- erlang 实现
os apns-apple notification server 与第三方provider的通信原理网上已有很多介绍,这里不再介绍,有想了解的大家可以去IOS官网https://developer. ...
- CentOS6.8忘记root密码的解决办法(开始初始化也可以用)
在开机启动的时候按键盘上的“E”键会进入如下界面. 选择相应的内核,再次按“E”,出现下图,选择第二项,再次按“E”键 经过第二步,这个画面可以编辑,在信息的最后加“空格”,然后键入“single”( ...
- 使用 JMeter 完成常用的压力测试 [转]
讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测试.但是软件仅仅只是功能正确是不够的.在实际开发中,还有其它的非功能因素也起着决定性的因素,例如软件的响应速度.影响软件响应速度的 ...
- Java 9的日期时间格式化趋近Unicode区域设置标准
1.JDK-8148947,DataTimeFormatter的模式字母“g”:正如在LDML中定义的,字母“g”指代一个“简化儒略日期”,简化儒略日期与正常儒略日期的差别在于:(1)简化儒略 ...
- win7 64位下android开发环境的搭建
本文转自:http://www.cfanz.cn/index.php?c=article&a=read&id=65289 最近换了新电脑,装了win7 64位系统,安装了各种开发环境, ...
- 使用Unity制作的一个望远镜特效,在狙击手游戏中非经常见
仅仅须要编写一个脚本文件,然后就能随意设置放大缩小的速度.以及程度.
- HDU 2594 Simpsons’ Hidden Talents (KMP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594 这题直接用KMP算法就能够做出来,只是我还尝试了用扩展的kmp,这题用扩展的KMP效率没那么高. ...
- ios 添加动画的方法
转自文顶顶大神的博客:http://www.cnblogs.com/wendingding/p/3751519.html ios 开发UI中,经常会用添加动画效果的需求,下面就总结一下,添加动画的三种 ...
- 【RF库测试】DateTime库
术语说明: 1.Epoch指的是一个特定的时间:1970-01-01 00:00:00 UTC. 2.国际标准化组织的国际标准ISO 8601是日期和时间的表示方法,格式是 'YYYY-MM-DD h ...