`
trydofor
  • 浏览: 152945 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

JAVA乱码你知道(DIY)

阅读更多

1. 四个涉及编码的环节

 

java开发中的乱码问题,有4个环节:

1. java文件的编码。

2. class文件的编码。

3. jvm中的字符串编码。

4. 外部资源的编码。

 

2. java 文件的编码

 

java文件是可以指定编码的,默认是系统编码,如果GBK。

 

 

	public static void main(String[] args) {
		String s = "汉";
		System.out.println(s);
	}

 

文件以GBK保存。只要我们以 GBK打开文件,汉字部分就正常显示。

 

结论:java源文件可以任意编码

 

3.  class 文件编码

 

当 java文件编译成class时候,进行了一次编码转换。这里的例子是 GBK 到UTF8

也就是说 class文件是以UTF8格式保存的。

所以以UTF8打开这个class,我们能够看到这样的字符串:

“([Ljava/lang/String;)V 汉” 

当然,有些字符不能正确显示,需要以HEX查看。

 

结论:class文件是UTF8编码

 

4. jvm中的字符串编码。

 

    jvm中的字符串是 unicode的,或者叫 UTF16。(下面证据不太直接。)

 

String s1 = "汉";
String s2 = "お";
System.out.println(Integer.toString(s1.charAt(0), 16));
System.out.println(Integer.toString(s2.charAt(0), 16));
System.out.println(s1+s2);
 

5. 外部资源的编码

 

主要是各种可以和外部产生联系的输入和输出。

如,System.out/err/in这些是流,外部存在的文件(读入或写出)

 

System.out/err/in,默认使用系统编码集。

如,export LANG=en_US.UTF8

 

外部文件,在read或write时,指定合适的编码即可。

 

6. 字符集转换

 

字符集的转换很多时候会丢失信息,从而产生乱码。

因此,一定要有正确的编码集使字符串变为正确的unicode。

 

大家经常看到这样的东西:new String(input.getBytes("ISO-8859-1"), "GBK") 

发生了一下事情。

1) String(GBK) -->byte[](ISO-8859-1) -->JVM(UTF16)   这里是乱码

2) JVM(UTF16) -->byte[](ISO-8859-1) -->byte[GBK]-->JVM(UTF16) 这里转回来了。

如果是 String(GBK) -->byte[](GBK) -->JVM(UTF16), 那么就不会有乱码了。

 

7.  区分字符集和字体

 

有些时候,乱码是因为字体显示不正确造成的,这个赖不上字符集。

表象上:字体造成的乱码,一般表现为豆腐块,字符集表现为 问号。


分享到:
评论

相关推荐

    graphql-java-codegen-maven-plugin:graphql-java-codegen的Maven插件

    1. **代码生成**:当你的GraphQL schema发生变化时,graphql-java-codegen-maven-plugin能够自动更新Java模型类、数据传输对象(DTOs)以及GraphQL客户端的查询和变异操作。这减少了手动编写和维护这些代码的工作量...

    java-emoji-converter:Emoji转换工具,可以使用各种类型的客户端生成的Emoji字符串转换转换成另一种格式

    Java Emoji Converter(Emoji表情转换工具) Emoji转换工具,适合各种规格客户端生成的Emoji字符串转换成另外一种格式。 一种在每种类型之间转换表情符号字符串的工具,例如软银行表情符号,unicode表情符号,别名...

    商业源码-编程源码-DIY X7 Beta1 简体中文GBK版.zip

    1. **编程语言**:根据源码的类型,可能是C++、Java、Python、JavaScript或其他语言,需要熟悉相应的语法和编程习惯。 2. **软件架构**:理解DIY X7的整体设计,包括模块划分、数据流、控制流程等。 3. **GBK编码...

    Java Web应用详解.张丽(带详细书签).pdf

    动态网站篇深入讲解Servlet、JSP、JavaBean、JDBC数据库连接、数据库连接池等Java Web开发的核心技术。系统框架篇则是以架构设计的高度,讲解搭建网站的三大框架Struts、Hibernate、Sprin9及标签库。项目实战篇详细...

    springmvc:Spring MVC教程

    Spring MVC教程 教程学习: 本教程完整地讲解了Spring MVC的每个知识点,包括独立运行的Demo示例,欢迎一起交流学习。Java学习交流群:239126529 教程软件版本说明: ...Spring MVC Post中文乱码 @RequestPara

    电脑报2019年第17期-2019年5月6日

    由于文件内容的具体部分没有提供有效的文字信息,而是呈现了一系列的乱码,因此无法直接从中抽取知识点。因此,我将根据标题和描述信息,以及可预测的内容结构,构建一个大致的知识框架,关于《电脑报》一般会包含的...

    快乐360转盘插件_V5.3.2_Utf-8版

    在技术层面上,"Utf-8"标识意味着该插件采用了Unicode的UTF-8编码格式,这是目前互联网上最广泛使用的字符编码标准,确保了在不同语言环境下都能正确显示文字,避免了乱码问题,对全球化网站尤其友好。 该插件的...

    编码测试:编码测试

    在Java编程语言中,编码测试尤为重要,因为Java的默认编码可能会因操作系统而异,这可能导致编码问题,如乱码或数据丢失。 首先,我们需要理解编码的概念。编码是将字符(如字母、数字和符号)转换为二进制数字的...

    idea-settings

    2. **编码(File Encodings)**:控制项目的字符编码,确保在不同系统间传输文件时不会出现乱码问题。 3. **编辑器(Editor)**:包含字体、颜色方案、自动完成、行号显示、代码折叠等设置。 4. **快捷键(Keymap...

Global site tag (gtag.js) - Google Analytics