首页编程java编程java gbk 是什么?java 中文乱码问题 utf-8和gbk的区别

java gbk 是什么?java 中文乱码问题 utf-8和gbk的区别

编程之家2023-10-13147次浏览

老铁们,大家好,相信还有很多朋友对于java gbk 是什么和java 中文乱码问题 utf-8和gbk的区别的相关问题不太懂,没关系,今天就由我来为大家分享分享java gbk 是什么以及java 中文乱码问题 utf-8和gbk的区别的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

java gbk 是什么?java 中文乱码问题 utf-8和gbk的区别

java 怎么判断编码是utf-8 还是gbk

字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1。

至于utf-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的论坛则用utf-8节省空间。

gbk包含全部中文字符;utf-8则包含全世界所有国家需要用到的字符。

java gbk 是什么?java 中文乱码问题 utf-8和gbk的区别

gbk是在国家标准gb2312基础上扩容后兼容gb2312的标准(好像还不是国家标准)

utf-8编码的文字可以在各国各种支持utf8字符集的浏览器上显示。

比如,如果是utf8编码,则在外国人的英文ie上也能显示中文,而无需他们下载ie的中文语言支持包。

java gbk 是什么?java 中文乱码问题 utf-8和gbk的区别

所以,对于英文比较多的论坛

,使用gbk则每个字符占用2个字节,而使用utf-8英文却只占一个字节。

utf8是国际编码,它的通用性比较好,外国人也可以浏览论坛,gbk是国家编码,通用性比utf8差,不过utf8占用的数据库比gbk大

java 做web项目什么时候用gbk什么时候用utf-8

UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。

对于一个网站、论坛来说,如果英文字符较多,则建议使用UTF-8节省空间。不过现在很多论坛的插件一般只支持GBK

java中字符集什么意思

Java中字符串在内核中使用 Unicode,也就是说每个字符 JVM只记录它的 Unicode Code Point,只有在网络传输或保存到磁盘上时才需要把它转换成特定的字符集的编码,这个字符集就是把一个 Unicode Code Point整数翻译成一串 byte[],因为在网络或磁盘上,字节是一个一个排列的,我们需要知道把高位字节排前面还是排后面并且容易推断出哪个哪个字节是一个字符的边界,这样才能把相关的几个字节还原成一个字符而不是把第2个字符的后面半数字节和第3个字符的前面半数的字节拼在一起出一个怪异的字符,我们以前在早期的电脑游戏中不支持双字节汉语时我们经常碰到这个问题,那就是先输入一个汉字,在内存中有2个字节,然后我们按一下 backspace软件只删除一个字节,我们再输入一个汉字之后一共有3个字节的,这时我们用一个支持汉字的软件来查看这个文字可能是第1个剩下的字节和后面的字符的第1字节拼起来刚好又是另一个汉字,而剩下的第3个字节就不是有意义的绘图符号。

当不需要把 JVM内存中的字符传输到网络外或磁盘上或打印出来的时候,我们是不需要知道字符集的,在显示在图形界面上时JVM知道怎么把它们显示出来,现在的 Windows操作系统同样也是 Unicode内核的,也就是说我们只要说明 Unicode Code Point它应该知道是什么字符,那么只剩下字体这边是否也是用 Unicode Code Point来对应一个字符啦(这个我不确定,但估计也是),如果操作系统和字符这边也是按 Unicode Code Point来对应,那么当我们不保存到磁盘或发送出网络时是完全不需要知道有字符集这回事的。

下面这个例子中处理一个 Unicode 6.0新标准中收录的汉字,你看到 UTF-8, UTF-16, GB18030支持它们,但 GB2312没有收录这个汉字,所以出个问号,也就是我们学说的乱码啦。

什么是 Unicode,下面这样的表格就是 Unicode,而那些坐标数字就是 Code Point.

JDK 1.5的 String这个类支持 Unicode Code Point,也就是说能处理任何任意超出双字节的字符的处理,它是一些学术研究者(比如考古,古文献研究)必须的功能,回想起来曾经的电报码翻译成电脑信息时由于输入法和字符集没有收录这些字没办法通过“输入一个数字得到这个字符的途径",大家都是先扫描一个用图片再在电脑中剪切出每个字符的小图片贴出来的。记得在汉字处理时如果碰到冷僻字时它会超出2个字节,用 charAt()这个是会出错的,因为 char类型表示范围在 0- 255之间(2个字节),不能直接保存冷僻字,需要用2个 char来表示一个字,因此 substring的位置全是错误的,我们需要 offsetByCodePoints重新计算一次 index才能正确地 substring。

publicstaticvoidmain(String[]args)throwsIOException

{

int[]codePoints=newint[16];

for(inti=0;i<16;i++)

{

codePoints[i]=0x20020+i;

}

Stringa=newString(codePoints,0,codePoints.length);

System.out.println("字符串:"+a);

System.out.println("字符串换算成char[]存储总长度是:"+a.length());

System.out.println("codePointAt(7)索引换算成charAt索引:"+a.offsetByCodePoints(1,7));

Stringc=a.substring(a.offsetByCodePoints(1,7),a.offsetByCodePoints(1,8));

System.out.println("UTF-8for"+c+"is"+toString(c.getBytes("UTF-8"))+"==>"

+newString(c.getBytes("UTF-8"),"UTF-8"));

System.out.println("UTF-16for"+c+"is"+toString(c.getBytes("UTF-16"))+"==>"

+newString(c.getBytes("UTF-16"),"UTF-16"));

System.out.println("GB2312for"+c+"is"+toString(c.getBytes("GB2312"))+"==>"

+newString(c.getBytes("GB2312"),"GB2312"));

System.out.println("GB18030for"+c+"is"+toString(c.getBytes("GB18030"))+"==>"

+newString(c.getBytes("GB18030"),"GB18030"));

}

privatestaticStringtoString(byte[]input)

{

StringBufferb=newStringBuffer();

b.append('[');

for(inti=0,size=input.length;i<size;i++)

{

b.append(Integer.toString(input[i]));

if(i<size-1)

b.append(',');

}

b.append(']');

returnb.toString();

}

这个代码输出如下,为防止百度或者说你的电脑未安装支持冷僻字的字体,不能正确显示冷僻字,这里面用图片啦。

java 中文乱码问题 utf-8和gbk的区别

这其中存在一个转换问题:

如System.out.println(new String("中国".getBytes("gbk"),"utf-8"));

System.out.println(new String("中国".getBytes("utf-8"),"gbk"));

//将“中国“的gbk编码格式按着utf-8解析,或者反过来都会出现乱码。

如浏览器当前为gbk编码,就以gbk编码格式来提交。这本身是不会出现乱码的,问题就出在Web服务器接收数据的时候,HttpServletRequest在将客户端传来的数据转成ucs2码上出了问题。在默认情况下,是按着iso-8859-1编码格式来转的,而这种编码格式并不支持中文,所以也就无法正常显示中文了,解决这个

问题的方法是用和客户端浏览器当前编码格式一致的编码来转换,如果是utf-8,则在doPost方法中应该用以下的语句来处理:

request.setCharacterEncoding("utf-8");

文章分享结束,java gbk 是什么和java 中文乱码问题 utf-8和gbk的区别的答案你都知道了吗?欢迎再次光临本站哦!

java里什么是实际参数 Java中实际参数和形式参数的区别java编译阶段做什么 Java程序员可以从事哪些工作