Java中字符编码和字符串所占字节数 .

news/2024/7/16 7:45:59 标签: java, string, 终端, 编译器, ide, class
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">  

Java中字符串所占的字节数和字符编码密切相关。

Java编码实际上可以涉及这几个方面的知识:IDE的编码,操作系统默认编码,Java字符编码。

例如:我们使用eclipse编写Java程序时,可以在工程属性中设置Java程序的编码,若不设置,则程序的编码默认是操作系统的编码,这里设置的编码即为代码文件的编码;或者我们使用vim编写Java程序时,可以设置系统的环境变量LANG,例如 zh_CN.UTF-8,zh_CN.GB18030等,此时,代码文件的编码就是LANG所指定的编码。这就是IDE的编码,IDE的编码很重要,例如一个Java代码文件是UTF-8编码的,而你的IDE是GB18030编码,则显示就会出现乱码了。

Java中字符的编码是指Java中的字符串所采取的编码,例如有下面一段程序,用于计算字符串所占字节数,运行在Windows 7上:

class="dp-highlighter bg_class="tags" href="/tags/JAVA.html" title=java>java">
class="bar">
class="tools"> [class="tags" href="/tags/JAVA.html" title=java>java] view plain copy print ?
    class="dp-j">
  1. class="alt">class="keyword">public class="keyword">class Charset {  
  2.   
  3. class="alt">        class="keyword">public class="keyword">static class="keyword">void main(String[] args) {  
  4.                 class="comment">// TODO Auto-generated method stub   
  5. class="alt">                String msg = class="class="tags" href="/tags/STRING.html" title=string>string">"中国abc";  
  6.                 System.out.println(msg);  
  7. class="alt">                class="keyword">int len = msg.getBytes().length;class="comment">//按操作系统默认编码来编码   
  8.                 System.out.println(len);  
  9. class="alt">                class="keyword">try{  
  10.                         len = msg.getBytes(class="class="tags" href="/tags/STRING.html" title=string>string">"GB2312").length;class="comment">//输出7   
  11. class="alt">                        System.out.println(class="class="tags" href="/tags/STRING.html" title=string>string">"GB2312: "+len);  
  12.                         len = msg.getBytes(class="class="tags" href="/tags/STRING.html" title=string>string">"GBK").length;class="comment">//输出7   
  13. class="alt">                        System.out.println(class="class="tags" href="/tags/STRING.html" title=string>string">"GBK: "+len);  
  14.                         len = msg.getBytes(class="class="tags" href="/tags/STRING.html" title=string>string">"GB18030").length;class="comment">//输出7, 2*2+3,一个汉字占2字节,一个英文字母一个字节   
  15. class="alt">                        System.out.println(class="class="tags" href="/tags/STRING.html" title=string>string">"GB18030: "+len);  
  16.                         len = msg.getBytes(class="class="tags" href="/tags/STRING.html" title=string>string">"UTF-8").length;class="comment">//输出9, 2*3+3=9,一个汉字占3字节,一个英文字母一个字节.   
  17. class="alt">                        System.out.println(class="class="tags" href="/tags/STRING.html" title=string>string">"UTF-8: "+len);  
  18.                         len = msg.getBytes(class="class="tags" href="/tags/STRING.html" title=string>string">"UTF-16").length;class="comment">//输出12   
  19. class="alt">                        System.out.println(class="class="tags" href="/tags/STRING.html" title=string>string">"UTF-16: "+len);  
  20.                         len = msg.getBytes(class="class="tags" href="/tags/STRING.html" title=string>string">"UTF-32").length;class="comment">//输出20   
  21. class="alt">                        System.out.println(class="class="tags" href="/tags/STRING.html" title=string>string">"UTF-32: "+len);  
  22.                         len = msg.getBytes(class="class="tags" href="/tags/STRING.html" title=string>string">"Unicode").length;class="comment">//输出12   
  23. class="alt">                        System.out.println(class="class="tags" href="/tags/STRING.html" title=string>string">"Unicode: "+len);  
  24.                 } class="keyword">catch ( class="tags" href="/tags/JAVA.html" title=java>java.io.UnsupportedEncodingException e)  
  25. class="alt">                {  
  26.                         System.out.println(e.getMessage().toString());  
  27. class="alt">                }  
  28.         }  
  29. class="alt">  
  30. }  

程序输出是:

中国abc
7
GB2312: 7
GBK: 7
GB18030: 7
UTF-8: 9
UTF-16: 12
UTF-32: 20
Unicode: 12

分析:
len = msg.getBytes() .length 的值是7,这是因为Windows 7操作系统字符编码是GBK(GB2312或GBK或GB18030),Java在运行程序时以操作系统默认编码来编码字符,所以字符所占字节数是7。

若该段程序放在,

class="dp-highlighter bg_plain">
class="bar">
class="tools"> [plain] view plain copy print ?
  1. class="alt">[zhankunlin@IctHTC class="tags" href="/tags/JAVA.html" title=java>javatest]$ export LANG=zh_CN.GB18030  
  2. [zhankunlin@IctHTC class="tags" href="/tags/JAVA.html" title=java>javatest]$ vim Charset.class="tags" href="/tags/JAVA.html" title=java>java  (编写Java代码文件时,使用的编码是zh_CN.GB18030,即代码文件中的编码是 GB18030)  
  3. class="alt">[zhankunlin@IctHTC class="tags" href="/tags/JAVA.html" title=java>javatest]$ class="tags" href="/tags/JAVA.html" title=java>javac Charset.class="tags" href="/tags/JAVA.html" title=java>java   
  4. [zhankunlin@IctHTC class="tags" href="/tags/JAVA.html" title=java>javatest]$ class="tags" href="/tags/JAVA.html" title=java>java Charset  (LANG=zh_CN.GB18030,即系统默认编码是GB18030)  
  5. class="alt">中国abc  
  6. 7 (系统默认编码是GB18030,所以占7个字节)     
  7. class="alt">GB2312: 7  
  8. GBK: 7  
  9. class="alt">GB18030: 7  
  10. UTF-8: 9  
  11. class="alt">UTF-16: 12  
  12. UTF-32: 20  
  13. class="alt">Unicode: 12  
  14. [zhankunlin@IctHTC class="tags" href="/tags/JAVA.html" title=java>javatest]$ export LANG=zh_CN.UTF-8 (更改系统编码为 UTF-8 )  
  15. class="alt">[zhankunlin@IctHTC class="tags" href="/tags/JAVA.html" title=java>javatest]$ class="tags" href="/tags/JAVA.html" title=java>java Charset  
  16. 涓..abc  (由于XShellclass="tags" href="/tags/ZhongDuan.html" title=终端>终端编码没有设置成 UTF-8,所以打印出现乱码)  
  17. class="alt">9 (操作系统编码是UTF-8,所以占9个字节)  
  18. GB2312: 7  
  19. class="alt">GBK: 7  
  20. GB18030: 7  
  21. class="alt">UTF-8: 9  
  22. UTF-16: 12  
  23. class="alt">UTF-32: 20  
  24. Unicode: 12  
class="dp-highlighter bg_plain">
class="bar">
class="tools"> [plain] view plain copy print ?
  1. class="alt">{设置XShellclass="tags" href="/tags/ZhongDuan.html" title=终端>终端编码为 utf-8 }  
class="dp-highlighter bg_plain">
class="bar">
class="tools"> [plain] view plain copy print ?
  1. class="alt">[zhankunlin@IctHTC class="tags" href="/tags/JAVA.html" title=java>javatest]$ class="tags" href="/tags/JAVA.html" title=java>java Charset  
  2. 中国abc  (打印正常)  
  3. class="alt">9  
  4. GB2312: 7  
  5. class="alt">GBK: 7  
  6. GB18030: 7  
  7. class="alt">UTF-8: 9  
  8. UTF-16: 12  
  9. class="alt">UTF-32: 20  
  10. Unicode: 12  
  11. class="alt">[zhankunlin@IctHTC class="tags" href="/tags/JAVA.html" title=java>javatest]$ vim Charset.class="tags" href="/tags/JAVA.html" title=java>java   
class="dp-highlighter bg_plain">
class="bar">
class="tools"> [plain] view plain copy print ?
  1. class="alt">[zhankunlin@IctHTC class="tags" href="/tags/JAVA.html" title=java>javatest]$ class="tags" href="/tags/JAVA.html" title=java>javac Charset.class="tags" href="/tags/JAVA.html" title=java>java  (程序代码文件编码是 GB18030,而编译时系统编码是 UTF-8,class="tags" href="/tags/BianYiQi.html" title=编译器>编译器编译时若没有任何指定就会以操作系统编码的方式去读取代码文件进行编译,所以出现警告)  
  2. Charset.class="tags" href="/tags/JAVA.html" title=java>java:6: 璀?.锛.??.UTF8 ?.??..灏..绗  
  3. class="alt">                String msg = "锟叫癸拷abc";  
  4.                               ^  
  5. class="alt">Charset.class="tags" href="/tags/JAVA.html" title=java>java:6: 璀?.锛.??.UTF8 ?.??..灏..绗  
  6.                 String msg = "锟叫癸拷abc";  
class="dp-highlighter bg_plain">
class="bar">
class="tools"> [plain] view plain copy print ?
  1. class="alt">[zhankunlin@IctHTC class="tags" href="/tags/JAVA.html" title=java>javatest]$ class="tags" href="/tags/JAVA.html" title=java>javac -encoding gb18030 Charset.class="tags" href="/tags/JAVA.html" title=java>java  (使用 -encoding 选项指定程序文件的编码格式,则编译不会出问题)  
  2. [zhankunlin@IctHTC class="tags" href="/tags/JAVA.html" title=java>javatest]$ class="tags" href="/tags/JAVA.html" title=java>java Charset {打印正常,因为XShellclass="tags" href="/tags/ZhongDuan.html" title=终端>终端编码已经设置为了 utf-8 }}  
  3. class="alt">中国abc  
  4. 9  
  5. class="alt">GB2312: 7  
  6. GBK: 7  
  7. class="alt">GB18030: 7  
  8. UTF-8: 9  
  9. class="alt">UTF-16: 12  
  10. UTF-32: 20  
  11. class="alt">Unicode: 12  
class="dp-highlighter bg_plain">
class="bar">
class="tools"> [plain] view plain copy print ?
  1. class="alt"><pre>  
class="dp-highlighter bg_plain">
class="bar">
class="tools"> [plain] view plain copy print ?
  1. class="alt"></pre><pre name="code" class="plain">  
class="dp-highlighter bg_plain">
class="bar">
class="tools"> [plain] view plain copy print ?
  1. class="alt"></pre><pre name="code" class="plain">  
class="dp-highlighter bg_plain">
class="bar">
class="tools"> [plain] view plain copy print ?
  1. class="alt"></pre><pre name="code" class="plain"><pre>  

http://www.niftyadmin.cn/n/1760231.html

相关文章

CANoe中的DLL编程

文章目录前言Vector 官方Demo关键参数说明总结前言 CANoe是目前汽车电子开发中差常用的工具&#xff0c;因为其封闭性&#xff08;Vector独有&#xff09;&#xff0c;开发的时候&#xff0c;有很多局限性&#xff1b;这个时候我们可以通过C的强大来弥补CAPL的不足&#xff0c;…

Pyqt5 designer制作的.ui 转化为.py 怎么直接使用

.ui界面是&#xff1a; 生成的.py是&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file html_to_doors.ui # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost!from PyQt5 im…

VS2019预览版发布了

VS2019正式版已发布&#xff1a;https://www.cnblogs.com/zhaogaojian/p/10648904.html 1、点击下载https://visualstudio.microsoft.com/zh-hans/vs/preview/ 2、开始安装 3、安装界面和2017差不多 4、.net Core依然是2.1 5、.net EF依然是EF6 6、连C也依然是2017的 都不知道更…

Java知识拾遗:三大框架的技术起源

Struts、Hibernate和Spring是我们Java开发中的常用关键&#xff0c;他们分别针对不同的应用场景给出最合适的解决方案。但你是否知道&#xff0c;这些知名框架最初是怎样产生的?我们知道&#xff0c;传统的Java Web应用程序是采用JSPServletJavabean来实现的&#xff0c;这种模…

CAPL 脚本下调用cmd 和其它应用程序

&#x1f4d9; 相关文章 &#x1f6a9;本章节内容演示源码下载&#xff0c;点击跳转&#x1f447; &#x1f4d8;前言 &#x1f345; CAPL脚本中插入cmd指令和调用第三方程序&#x1f345;演示软硬件环境 Win10 x64 &#xff1b; CANoe 11 SP2 x64 目录&#x1f4d9; 相关文章&…

C# 图解教程 第一章 C#和.NET框架

C#和.NET框架 在.NET之前 20世纪90年代&#xff0c;微软平台多数程序员使用VB、C或C。他们使用的技术都有问题。 技术问题纯Win32 API不是面向对象&#xff0c;工作量比MFC大MFC(Microsoft Foundation Class,微软基础类库)虽是面向对象&#xff0c;但是不一致&#xff0c;且过于…

Java中各类Cache机制实现解决方案

在Java中&#xff0c;不同的类都有自己单独的Cache机制&#xff0c;实现的方法也可能有所不同&#xff0c;文章列举了Java中常见的各类Cache机制的实现方法&#xff0c;同时进行了综合的比较。OSCacheOSCache是个一个广泛采用的高性能的Java EE缓存框架&#xff0c;OSCache能用…

基于Python/Capl脚本 对通信矩阵报文(Flexray/CAN)的周期检测(一)

&#x1f4d8;前言 &#x1f345; 在汽车电子系统测试中&#xff0c;离不开对报文周期的测试&#xff0c;如果系统比较复杂&#xff0c;要处理成千上万个报文&#xff0c;如果纯手动测试&#xff0c;会耗费人力&#xff0c;在CAPL脚本的基础上&#xff0c;通过python 解析 arxm…