Java做了一个小键盘录入翻打传票的题,为什么录入第二句会跑到很远的地方?而且中文会乱码?

Java做了一个键盘录入的题,为什么录入第二句会跑到很远的地方?而且中文会乱码?_百度知道
Java做了一个键盘录入的题,为什么录入第二句会跑到很远的地方?而且中文会乱码?
我有更好的答案
编码改了吗~
为什么会跳很多行
因为空格也算输入。。😳
我没输入空格
说错了,,回车
你在输出的字符串前后加上字符串
System.out.println(&字符串:&+sb.toString()+&这是结束。&);
输完hello word再按enter继续按看看咋样
把delete后的字符串也输出来,如System.out.println(&delete&+sb);
我也有几个地方不明白,为什么等于10或13呢,我用debug都没看出来为啥,可能是这个乱码了
你有木有发现回车之后,除掉你加上的字符串,打印出来的sb是空白
这不是换行符吗,遇到换行符直接打印啊
你有木有试试加上字符串哪
不觉得奇怪吗,应该在一行打印的,结果两行打印
我觉得可能在输入hello后的回车也加进去了。所以在打印完sb.toString后执行回车\n,所以剩下的就换行打印了
采纳率:40%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Java 编码中文问题系统透彻讲解 UNICODE GBK UTF-8 ISO-8859-1 之间的区别 | 基于实例代码分步讲解 一站式学习Java | how2j.cn
本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器
如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)
走神了?退回10秒
计算机存放数据只能存放数字,所有的字符都会被转换为不同的数字。就像一个棋盘一样,不同的字,处于不同的位置,而不同的位置,有不同的数字编号。有的棋盘很小,只能放数字和英文有的大一点,还能放中文有的&足够&大,能够放下世界人民所使用的所有文字和符号如图所示,英文字符 A 能够放在所有的棋盘里,而且位置都差不多中文字符, 中文字符 中 能够放在后两种棋盘里,并且位置不一样,而且在小的那个棋盘里,就放不下中文
工作后经常接触的编码方式有如下几种:ISO-8859-1 ASCII 数字和西欧字母GBK GB2312 BIG5 中文UNICODE (统一码,万国码)其中ISO-8859-1 包含 ASCIIGB2312 是简体中文,BIG5是繁体中文,GBK同时包含简体和繁体以及日文。UNICODE 包括了所有的文字,无论中文,英文,藏文,法文,世界所有的文字都包含其中
根据前面的学习,我们了解到不同的编码方式对应不同的棋盘,而UNICODE因为要存放所有的数据,那么它的棋盘是最大的。 不仅如此,棋盘里每个数字都是很长的(4个字节),因为不仅要表示字母,还要表示汉字等。如果完全按照UNICODE的方式来存储数据,就会有很大的浪费。比如在ISO-8859-1中,a 字符对应的数字是0x61而UNICODE中对应的数字是 0x,倘若一篇文章大部分都是英文字母,那么按照UNICODE的方式进行数据保存就会消耗很多空间在这种情况下,就出现了UNICODE的各种减肥子编码, 比如UTF-8对数字和字母就使用一个字节,而对汉字就使用3个字节,从而达到了减肥还能保证健康的效果UTF-8,UTF-16和UTF-32 针对不同类型的数据有不同的减肥效果,一般说来UTF-8是比较常用的方式UTF-8,UTF-16和UTF-32 彼此的区别在此不作赘述,有兴趣的可以参考
写在.java源代码中的汉字,在执行之后,都会变成JVM中的字符。而这些中文字符采用的编码方式,都是使用UNICODE. &中&字对应的UNICODE是4E2D,所以在内存中,实际保存的数据就是十六进制的0x4E2D, 也就是十进制的20013。
public class TestStream {
public static void main(String[] args) {
String str = &中&;
public class TestStream {
public static void main(String[] args) {
String str = &中&;
以字符 中 为例,查看其在不同编码方式下的值是多少也即在不同的棋盘上的位置
import java.io.UnsupportedEncodingE
public class TestStream {
public static void main(String[] args) {
String str = &中&;
showCode(str);
private static void showCode(String str) {
String[] encodes = { &BIG5&, &GBK&, &GB2312&, &UTF-8&, &UTF-16&, &UTF-32& };
for (String encode : encodes) {
showCode(str, encode);
private static void showCode(String str, String encode) {
System.out.printf(&字符: \&%s\& 的在编码方式%s下的十六进制值是%n&, str, encode);
byte[] bs = str.getBytes(encode);
for (byte b : bs) {
int i = b&0
System.out.print(Integer.toHexString(i) + &\t&);
System.out.println();
System.out.println();
} catch (UnsupportedEncodingException e) {
System.out.printf(&UnsupportedEncodingException: %s编码方式无法解析字符%s\n&, encode, str);
接下来讲,字符在文件中的保存字符保存在文件中肯定也是以数字形式保存的,即对应在不同的棋盘上的不同的数字用记事本打开任意文本文件,并且另存为,就能够在编码这里看到一个下拉。ANSI
这个不是ASCII的意思,而是采用本地编码的意思。如果你是中文的操作系统,就会使GBK,如果是英文的就会是ISO-8859-1Unicode UNICODE原生的编码方式Unicode big endian 另一个 UNICODE编码方式UTF-8 最常见的UTF-8编码方式,数字和字母用一个字节, 汉字用3个字节。
eclipse也有类似的编码方式,右键任意文本文件,点击最下面的&property&就可以看到Text file encoding也有ISO-8859-1,GBK,UTF-8等等选项。其他的US-ASCII,UTF-16,UTF-16BE,UTF-16LE不常用。
为了能够正确的读取中文内容1. 必须了解文本是以哪种编码方式保存字符的2. 使用字节流读取了文本后,再使用对应的编码方式去识别这些数字,得到正确的字符如本例,一个文件中的内容是字符中,编码方式是GBK,那么读出来的数据一定是D6D0。再使用GBK编码方式识别D6D0,就能正确的得到字符中注: 在GBK的棋盘上找到的中字后,JVM会自动找到中在UNICODE这个棋盘上对应的数字,并且以。
import java.io.F
import java.io.FileInputS
import java.io.IOE
public class TestStream {
public static void main(String[] args) {
File f = new File(&E:\\project\\j2se\\src\\test.txt&);
try (FileInputStream fis = new FileInputStream(f);) {
byte[] all = new byte[(int) f.length()];
fis.read(all);
//文件中读出来的数据是
System.out.println(&文件中读出来的数据是:&);
for (byte b : all)
int i = b&0x000000
//只取16进制的后两位
System.out.println(Integer.toHexString(i));
System.out.println(&把这个数字,放在GBK的棋盘上去:&);
String str = new String(all,&GBK&);
System.out.println(str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
FileReader得到的是字符,所以一定是已经把字节根据某种编码识别成了字符了而FileReader使用的编码方式是Charset.defaultCharset()的返回值,如果是中文的操作系统,就是GBKFileReader是不能手动设置编码方式的,为了使用其他的编码方式,只能使用InputStreamReader来代替,像这样:new InputStreamReader(new FileInputStream(f),Charset.forName(&UTF-8&)); 在本例中,用记事本另存为UTF-8格式,然后用UTF-8就能识别对应的中文了。解释: 为什么中字前面有一个?如果是使用记事本另存为UTF-8的格式,那么在第一个字节有一个标示符,叫做BOM用来标志这个文件是用UTF-8来编码的。
import java.io.F
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.FileR
import java.io.IOE
import java.io.InputStreamR
import java.io.UnsupportedEncodingE
import java.nio.charset.C
public class TestStream {
public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException {
File f = new File(&E:\\project\\j2se\\src\\test.txt&);
System.out.println(&默认编码方式:&+Charset.defaultCharset());
//FileReader得到的是字符,所以一定是已经把字节根据某种编码识别成了字符了
//而FileReader使用的编码方式是Charset.defaultCharset()的返回值,如果是中文的操作系统,就是GBK
try (FileReader fr = new FileReader(f)) {
char[] cs = new char[(int) f.length()];
fr.read(cs);
System.out.printf(&FileReader会使用默认的编码方式%s,识别出来的字符是:%n&,Charset.defaultCharset());
System.out.println(new String(cs));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//FileReader是不能手动设置编码方式的,为了使用其他的编码方式,只能使用InputStreamReader来代替
//并且使用new InputStreamReader(new FileInputStream(f),Charset.forName(&UTF-8&)); 这样的形式
try (InputStreamReader isr = new InputStreamReader(new FileInputStream(f),Charset.forName(&UTF-8&))) {
char[] cs = new char[(int) f.length()];
isr.read(cs);
System.out.printf(&InputStreamReader 指定编码方式UTF-8,识别出来的字符是:%n&);
System.out.println(new String(cs));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
&姿势不对,事倍功半!
找出 E5 B1 8C 这3个十六进制对应UTF-8编码的汉字
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器
如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)
走神了?退回10秒
import java.io.UnsupportedEncodingE
public class TestStream {
public static void main(String[] args) throws UnsupportedEncodingException {
找出 E5 B1 8C 这3个十六进制对应UTF-8编码的汉字
byte[] bs = new byte[3];
bs[0] = (byte) 0xE5;
bs[1] = (byte) 0xB1;
bs[2] = (byte) 0x8C;
String str
=new String(bs,&UTF-8&);
System.out.println(&E5 B1 8C 对应的字符是:&+str);
import java.io.UnsupportedEncodingE
public class TestStream {
public static void main(String[] args) throws UnsupportedEncodingException {
找出 E5 B1 8C 这3个十六进制对应UTF-8编码的汉字
byte[] bs = new byte[3];
bs[0] = (byte) 0xE5;
bs[1] = (byte) 0xB1;
bs[2] = (byte) 0x8C;
String str
=new String(bs,&UTF-8&);
System.out.println(&E5 B1 8C 对应的字符是:&+str);
&姿势不对,事倍功半!
如果用记事本根据UTF-8编码保存汉字就会在最前面生成一段标示符,这个标示符用于表示该文件是使用UTF-8编码的。找出这段标示符对应的十六进制,并且开发一个方法,自动去除这段标示符
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器
如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)
走神了?退回10秒
import java.io.F
import java.io.FileInputS
import java.io.IOE
import java.util.A
public class TestStream {
public static void main(String[] args) {
File f = new File(&E:\\project\\j2se\\src\\test.txt&);
try (FileInputStream fis = new FileInputStream(f);) {
byte[] all = new byte[(int) f.length()];
fis.read(all);
System.out.println(&首先确认按照UTF-8识别出来有?&);
String str = new String(all,&UTF-8&);
System.out.println(str);
System.out.println(&根据前面的所学,知道'中'字对应的UTF-8编码是:e4 b8 ad&);
System.out.println(&打印出文件里所有的数据的16进制是:&);
for (byte b : all) {
int i = b&0
System.out.print(Integer.toHexString(i)+ & &);
System.out.println();
System.out.println(&通过观察法得出 UTF-8的 BOM 是 ef bb bf&);
byte[] bom = new byte[3];
bom[0] = (byte) 0
bom[1] = (byte) 0
bom[2] = (byte) 0
byte[] fileContentWithoutBOM= removeBom(all,bom);
System.out.println(&去掉了BOM之后的数据的16进制是:&);
for (byte b : fileContentWithoutBOM) {
int i = b&0
System.out.print(Integer.toHexString(i)+ & &);
System.out.println();
System.out.println(&对应的字符串就没有问号了:&);
String strWithoutBOM=new String(fileContentWithoutBOM,&UTF-8&);
System.out.println(strWithoutBOM);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
private static byte[] removeBom(byte[] all, byte[] bom) {
return Arrays.copyOfRange(all, bom.length, all.length);
把你的代码复制到下面区域。 如果在线比较不好用,请使用客户端比较软件:
代码高亮插件双击即可选中,不过部分同学反应,通过代码高亮插件复制的代码无法在IDEA里正常显示,这里提供TEXTAREA的方式,方便复制,谢谢
根据练习目标尽量自己实现代码效果,期间会碰到疑问,难题,和自己不懂的地方,这些都是必要的过程
完成过程中,碰到无法解决的问题,带着疑问,查看答案,分析答案的解决思路
依然有不明白的地方,点开视频讲解,带着疑问,听视频讲解有问题的部分
理解后,再从头做一遍,把有疑问的地方都捋清楚
最后再总结一边,总结思路,总结解决办法,以后遇到类似的问题,怎么处理
把这时的想法,思路,研究都记录下来,等全部学完了,再回过头来巩固和理解,学习效果就会很好,知识点掌握得也牢固
HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
helloJavaa
答案时间:
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
答案时间:
答案时间:
答案时间:
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
提问之前请
喜迎寒假,沉淀提高,全场五折,优惠码:SPRING
可用于全站通
有效期1.28-1.31java乱码问题
最近又碰到了中文乱码问题,这里我没有把数据库牵扯进来,先说下我的环境,servlet容器使用Tomcat6.0,浏览器FireFox3.0、IE6,涉及字符编码设置的地方我的思路就是编码的地方都统一使用UTF-8,具体配置如下:
1.所有页面的charset设置为UTF-8。
2.Tomcat的URIEncoding默认是ISO-8859-1,而我设置为UTF-8,主要是想解决中文命名的文件以及请求以get方式提交有可能出现的乱码问题。
3.添加过滤器,调用request.setCharacterEncoding("utf-8")方法将request的字符集设定为utf-8,解决请求以post方式提交的乱码问题。
其实这样的设置貌似是不会再出现乱码问题了,不过,问题依旧来了,如果我在浏览器的地址栏中输入中文参数提交,返回的页面却出现了乱码。真搞不明白到底是哪里出了问题!说起来对中文乱码的问题一直是一支半解,出现乱码了,网上搜罗了一大堆资料,按照网上的配置,问题到是解决了,不过原理却搞的很模糊,一个请求发送到服务器,服务器业务逻辑处理后返回一个页面,这中间涉及的字符集转换,编码,解码过程一概不清楚。这次,折腾了半天,总算是更进一步了解了字符编码问题,这里做个总结。
先看我的总结,有不对的地方欢迎批评。
首先我们看下,一个请求响应的流程
浏览器 IE/FireFox -----------&Servlet容器------------------------&显示页面
使用容器的URIEncoding转码
我把用户发送请求方式不同引起的中文问题划分了四种类型:
1、表单的get提交
2、表单的post提交
3、页面链接传递中文参数
4、地址栏中参数直接输入中文提交
1.首先我们看表单get方式提交
浏览器根据页面的charset编码方式对页面进行编码,然后提交至服务器,首先进入对应的字符编码过滤器(如果有的话),不过Tomcat6.0对于get提交方式采用的是server.xml文件中的URIEncoding编码方式,而并不会采用过滤器中设置的编码,那么根据我的环境设置,jsp页面都使用UTF-8的编码,Servlet容器的URIEncoding也设置为UTF-8,则servlet不用进行转码即可正确解码,获得正常的中文字符串。那么,响应页面的中文因为页面的统一编码(UTF-8)自然也会正常显示。当然,如果我们Tomcat的URIEncoding设置为其他非UTF-8的编码方式时,页面的内容进入Tomcat解析时,因为Tomcat和页面的编码不统一,就需要转码。例如,如果我们采用Tomcat默认的ISO-8859-1,那么当我们使用request.getParameter("yourVariable")获取表单参数值时其实Servlet就进行了转码,它会以容器编码方式进行解码,这个过程如下:
UTF-8(编码)--&ISO-58859-1(解码)
这个过程也相当于我们使用如下的语句
new String(变量值.getBytes("UTF-8"),"ISO-8859-1");
new String(变量值.getBytes("UTF-8"),"ISO-8859-1");
根据API的解释,先将变量值以UTF-8字符集编码转换为字节序列,再以ISO-8859-1字符集解码字节数组,构造出新的字符串对象。
等价于以下方式:
String code = "编码";
code = URLEncoder.encode(code,"UTF-8");
code = URLDecoder.decode(code,"ISO-8858-1");
String code = "编码";
code = URLEncoder.encode(code,"UTF-8");
code = URLDecoder.decode(code,"ISO-8858-1");
例如表单的username属性以字符串"编辑"提交,那么进入容器后,FormBean中的这个变量会乱码,request.getParameter(username)一样的效果,s1就是request返回的结果,下面是内存快照。
不过即使这样,我们依然可以使用不恰当的方法显示正常的中文,即逆向转码,例如上面的乱码,我们可以通过ISO8859-1--&UTF-8这种方式还原我们提交时的中文。以下是GBK,UTF-8,ISO-8859-1三者之间互相转换的内存快照:
我们可以看到,偶数汉字可以在UTF-8,GBK两者中互相转换,而奇数个汉字则不能。综上看来,貌似Tomcat的URIEncoding设置为UTF-8是最好的解决办法,不过这样的设置依然无法解决上面我所说的第三、第四种情况。大家继续向下看。(这里有一点我不确定,就是页面提交至Servlet容器时,是以页面的charset方式编码后直接进入容器,还是以charset转码为ISO-8859-1方式进入,大家有什么见解?)
2.表单的post提交
对于这种方式的请求,request.setCharacterEncoding("一般来自于web.xml中过滤器设置的参数")方法进行编码设置将会产生作用,struts的表单提交方式默认为post方式,那么按照上面我的环境设置,页面,容器,都采用UTF-8编码方式,就不会产生中文乱码问题。
3.页面链接中传递中文参数
我虚拟一个这样的场景,请求页面中有如下代码
String username = "编辑";
&a href="hello.do?username=&%=username%&"&页面中链接传递中文&/a&
String username = "编辑";
&a href="hello.do?username=&%=username%&"&页面中链接传递中文&/a&
对于这种方式,我们需要先将参数使用统一的编码方式编码,将编码后的字符放入链接,这里我对参数以UTF-8方式编码,如下
String username = java.net.URLEncoder.encode("编辑","UTF-8");
String username = java.net.URLEncoder.encode("编辑","UTF-8");
那么这样我们也不会产生中文乱码问题
4.地址栏中参数直接输入中文提交
例如浏览器地址栏中输入"http://localhost:8080/helloapp.do?username=编辑"提交,对于这种方式,浏览器不会采用页面的charset方式对URL中的中文进行编码后提交至服务器(IE,FireFox都一样),而是采用系统的GBK转码为ISO-8859-1之后提交至Servlet容器,那么,如果对于前三种方式我们所做的设置,在这里就有问题了,因为进入容器时中文进行了GBK至ISO-8859-1的转码,而之前我们的Servlet容器URIEncoding设置为UTF-8,当我们使用request.getParameter("username")时,相当于又进行了这样的流程GBK--&ISO-8859-1--&UTF-8,按照以上我们使用的测试中文,“编辑”,使用request.getParameter("username")则会得到这样的结果??。
我们可以看到
“编辑”经过从GBK--&ISO-8859-1--&UTF-8的过程后得到的就是??这样的结果,这里我们还会想到那进行2次逆向转码看看,不过可惜的是,结果为“锟洁辑”。对于这种情况,我们的解决办法就是,Tomcat的URIEncoding采用默认的ISO-8859-1字符集,那么我们可以在程序中通过ISO-8859-1--&GBK这样不恰当的逆向转码方式得到正常的中文“编辑”,但这样的结果是,我们get请求方式的中文处理解决办法就需要改变。如,在我的环境下就需要进行ISO-8859-1--&UTF-8的转码,挺不爽。
综上,对于乱码问题,前三种方式是一般用户的请求方式,第四种属于非正常途径的请求方式,对于这种方式产生的问题我认为无法很好的解决,也不需要解决。我看到javaeye对于这样的情况就没有处理,不知道大家在自己的项目中是如何处理的?我的实验是,IE6的设置会影响应用路径的编码方式,例如地址栏中请求一个中文JSP页面,如:编辑.jsp,IE默认是勾选"以UTF-8发送URL"项的,那么按照我上面总结的处理方式,这个请求可以正常显示页面。
如果取消IE的这个选项,那么浏览器会以GBK编码应用路径的中文;
按照我上面的设置,这里如果将Tomcat的URIEncoding设置为GBK,则也可以正常显示页面。对于FireFox3.0,则是以UTF-8编码。
最后,回到我的题目,向大家讨教下,IE6的“以UTF-8发送URL”选项设置对请求页面字符编码有影响吗?欢迎讨论!
我的测试代码共享给大家:),使用的是struts1.2,struts的jar包,大家可以去apache下载。
这里推荐个链接,有兴趣的可以深入了解更多字符集、编码的问题。
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.051 (s). 10 q(s)博客分类:
第一篇: 深入浅出Java中的中文乱码
一、为什么会有中文乱码:
其实很简单,一句话就能说明问题: 字符在保存时的编码格式如果和要显示(解码)时的编码格式不一样的话,就会出现乱码问题。
二、需要了解的事实:
1. Java中的任何String都是以UNICODE格式存在的。
很多人因为在GBK环境中使用String,会误以为String是GBK格式,实际上Java的String类中并没有存储CharSet信息的字段, 所有String中的字符只会以UNICODE的2字节形式存在。
2. String在构造时会逐一把字符按指定编码(默认值为系统编码GBK),转换为UNICODE字符,存入一个Char数组中,二这个Char数组中的元素都是无符号的16为字符。
如:对于java代码:new String(bytes, "gbk"):这并不是说,生成一个GBK编码的字符串,而JDK讲会按GBK的编码逐一的讲字节数组bytes中的字符转化为UNICODE的编码。
假设,bytes本是按GBK编码的,构造方法在发现一个最高位为0的byte就作为ascii字符处理,如果发现最高位为1,那么就和后面的一个byte合成中文字符,再转换编码。
可以看出,在这个过程,编码选择错误就会导致程序按错误方法辨认bytes,乱码就出现了。
其实这种情况下产生的乱码,很多时候还可以通过.getBytes()方法修复。
如:"中".getBytes("iso-8859-1");因为iso-8859-1是西欧编码,没有中文,所以"中"字被替换成63,显示'?',无法判断以前是什么值,从而显示乱码。所以如下String将被产生乱码: new String("中文".getBytes("iso-8859-1"), "iso-8859-1");
但如果目标编码方式支持中文,就不会损坏String:new String("中文".getBytes("utf-8"),"utf-8");
3. Java在显示字符时,还需要进行一次转换,把UNICODE字符转换成用于显示的字符编码形式。
其实很多时候,这个过程是自动的,会按系统的默认编码(一般是GBK)转换String。所以很明显如果指定转换的编码和我们指定的页面编码不一样,就会出现乱码。
这也说明虽然在Java的程序中只有一种编码(Unicode编码), 但是输出却可以有不同的编码。
4. 有时候,我们需要用 iso-8859-1格式分解String的中文,以便在不支持中文的系统中存储: new String("中文".getBytes("GBK"),"iso-8859-1");先通过GBK等支持中文的编码方式分解为byte数组,再作为iso-8859-1字符以组成字符串,这样就可避免了被替换为Char(63)。
三、需要了解的几个概念:
1. 要想解决java中文乱码问题,首先就有必要了解一下什么是字符,字符集,编码的概念。
1) 字符:是文字与符号的总称,包括文字、图形符号、数学符号等。
2)字符集:就是一组抽象字符的集合。
字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。繁体汉字字符集、日文汉字字符集等等。
3)编码: 计算机要处理各种字符,就需要将字符和二进制编码对应起来,这种对应关系就是字符编码。
制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。
2. 常用的编码格式:
1) ASCII编码是目前计算机中用得最广泛的字符集及其编码。2)ISO8859-1表示的是西欧语言的编码。由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,即时ISO8859-1表示的字符有限,但仍旧使用ISO-8859-1。 而且在很多协议上,默认使用该编码。3)Unicode(统一码、万国码、单一码) 是一种在计算机上使用的字符编码。通常我们所遇到过多UTF-8正是Unicode编码的实现方式。4)GB2312字集是简体字集;BIG5字集是台湾繁体字集;GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号。5)GB18030是国家制定的一个强制性大字集标准,它的推出使汉字集有了一个统一的标准。6)Linux系统默认使用的是ISO-8859-1编码,Win32系统默认使用的是GB2312编码。
3. 开发中怎样避免乱码问题
1) 开发环境编码要一致。如页面编码,数据库编码等。
Java在运行期一律以Unicode来存储字符,这样有利的支持了多语言环境。我们在开发过程中经常会用到文件读取。Java读文件的时候会用到系统默认的编码来解码文件。所以在用FileInputStream类读取文件可以指定编码读取。当然也可以在字节流和字符流相互转换时使用编码,如在InputStreamRedaer和OutputStreamWriter类中指定编码。
2) JSP页面乱码通常只要在页面开始地方用下面代码指定字符集编码即可。如果还不行,可以用如下的代码来转换 str=new String(str.getBytes("ISO-8859-1"),"页面编码方式");
3)使用正确的方式来解码:
JAVA在网络传输中使用的编码是"ISO-8859-1",故在输出时需要进行转化,如: String str=new String(str.getBytes("开发环境编码"), "ISO-8859-1");经过网络编码后的中文,要正确显示在页面上必须要用类似于下面的方式来解码:Stirng str=new String(str.getBytes("ISO-8859-1"),"开发环境编码");
下一篇讲详细讲解另一个问题:Spring中@ResponseBody中的中文乱码问题。
Josh_Persistence
浏览: 898242 次
来自: 上海
暴露了你的东家,, 哈哈。我没找 ...
VCenter、ESXServer、Cluster这些实体类在 ...
感谢楼主分享
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 小键盘录入 的文章

 

随机推荐