`
天高云淡000
  • 浏览: 56207 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

浅谈java乱码问题

阅读更多
最近做通信部分,在发送中文的时候遇到了乱码问题。纠结了很久终于找到了答案解决的问题。

乱码往往是字符集不统一造成的,而笔者的程序中却是另一种情况引起的。message += (char)ins.read();
就是因为这句代码。。。
原因是这样的:用char强制转型时,只能转换0—127之间的ASCII码,而我们的中文(在GBK/GB2312字符集中中文由两个字节表示,而这连个字节不再0-127范围之内)的字节经char强制转型出来的就是“?”了。
对此我的解决方案是把每个对到的字节都放入字节队列中,在转成数组,最后用String(bytes[])转成字符串。代码如下
                             read = bufferedInputStream.read();
                            byte byte1 = (byte)read;
				bytes.add(byte1);
				messageRead = new String(listToBytes(bytes));


代码中的bytes是字节队列,listToBytes是队列转成数组的方法。

下面我说一下上面提及通常的原因。
首先,我先介绍一下几种java中的常用的字符集:GBK,GB2312,ASCII,ISO-8859-1,UTF-8。。
要保证不乱码,我们首先要掌握不同字符在他们的字符集中占的字节个数。
GBK:英文占1字节,中文占2字节
GB2312:同GBK
ASCII:总长7bit。。一共包括0-127的字符。。占1字节。无法表示中文。
ISO-8859-1:总长8bit。。是ASCII的扩展。。占1字节
UTF-8:英文占1字节。中文占3字节。
代码实例:
	public static void compareCharset() {
		byte[] bytes1, bytes2, bytes3, bytes4, bytes5, bytes6, bytes7;
		String string = "a马";
		try {
			bytes1 = string.getBytes("GBK");
			System.out.println("以GBK编码程字节长度为" + bytes1.length);
			for (int i = 0; i < bytes1.length; i++) {
				System.out.println("以GBK编码每个字节是" + bytes1[i]);
			}
			bytes2 = string.getBytes("GB2312");
			System.out.println("以GB2312编码程字节长度为" + bytes2.length);
			for (int i = 0; i < bytes2.length; i++) {
				System.out.println("以GB2312编码每个字节是" + bytes2[i]);
			}
			bytes3 = string.getBytes("ISO-8859-1");
			System.out.println("以ISO-8859-1编码程字节长度为" + bytes3.length);
			for (int i = 0; i < bytes3.length; i++) {
				System.out.println("以ISO-8859-1编码每个字节是" + bytes3[i]);
			}
			bytes4 = string.getBytes("ASCII");
			System.out.println("以ASCII编码程字节长度为" + bytes4.length);
			for (int i = 0; i < bytes4.length; i++) {
				System.out.println("以ASCII编码每个字节是" + bytes4[i]);
			}
			bytes5 = string.getBytes("UTF-8");
			System.out.println("以UTF-8编码程字节长度为" + bytes5.length);
			for (int i = 0; i < bytes5.length; i++) {
				System.out.println("以UTF-8编码每个字节是" + bytes5[i]);
			}
			bytes7 = string.getBytes("UNICODE");
			System.out.println("以UNICODE编码程字节长度为" + bytes7.length);
			for (int i = 0; i < bytes7.length; i++) {
				System.out.println("以UNICODE编码每个字节是" + bytes7[i]);
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("有不支持的字符集存在");
		}
	}

打印出来是:
以GBK编码程字节长度为3
以GBK编码每个字节是97
以GBK编码每个字节是-62
以GBK编码每个字节是-19
以GB2312编码程字节长度为3
以GB2312编码每个字节是97
以GB2312编码每个字节是-62
以GB2312编码每个字节是-19
以ISO-8859-1编码程字节长度为2
以ISO-8859-1编码每个字节是97
以ISO-8859-1编码每个字节是63
以ASCII编码程字节长度为2
以ASCII编码每个字节是97
以ASCII编码每个字节是63
以UTF-8编码程字节长度为4
以UTF-8编码每个字节是97
以UTF-8编码每个字节是-23
以UTF-8编码每个字节是-87
以UTF-8编码每个字节是-84
以UNICODE编码程字节长度为6
以UNICODE编码每个字节是-2
以UNICODE编码每个字节是-1
以UNICODE编码每个字节是0
以UNICODE编码每个字节是97
以UNICODE编码每个字节是-102
以UNICODE编码每个字节是108

在表示字符串的时候,我们尽量要保证字符集一致才不会乱码。。。
分享到:
评论

相关推荐

    浅谈乱码问题的解决方案

    乱码问题在IT行业中是一个常见的困扰,特别是在处理字符编码时。乱码通常发生在数据的存储、传输或显示过程中,由于编码不一致或者编码转换错误导致的。本文将探讨两种主要的解决乱码问题的策略,分别是针对MySQL...

    浅谈JAVA编写系统中文显示问题及其处理.pdf

    "浅谈JAVA编写系统中文显示问题及其处理.pdf" JAVA 编写系统中文显示问题是指在使用 JAVA 语言进行系统编程时遇到的中文显示乱码问题。这些问题包括浏览器页面乱码、表单数据提交时的乱码、数据库中信息不能正确...

    浅谈为什么java命令运行class文件出现异常共7页.p

    在本资料"浅谈为什么java命令运行class文件出现异常共7页.pdf"中,可能详细讨论了这些常见问题及其解决方法。由于提供的压缩包中仅有一个名为"赚钱项目"的文件,这似乎与Java编程无关,因此可能不是解决上述问题的...

    浅谈Tomcat乱码与端口占用的解决方案

    在进行Tomcat服务器的配置和维护时,乱码问题和端口占用问题是用户经常遇到的两个典型难题。下面我将详细解析这两个问题的产生原因以及相应的解决方案。 首先,关于Tomcat乱码的问题,这通常发生在Tomcat服务器启动...

    浅谈mysql的中文乱码问题

    MySQL的中文乱码问题是一个常见的困扰开发者的问题,尤其是在进行数据导入、导出或者通过不同的工具与MySQL交互时。本文将详细解析这个问题,并提供相应的解决策略。 首先,问题出现在使用Eclipse通过JDBC向MySQL...

    浅谈Unicode编码

    Unicode java乱码 UTF-8

    java web学习_浅谈request对象中get和post的差异

    Java Web 学习之 Request 对象中 GET 和 ...POST 方法的优点是可以传输大量数据,但是缺点是可能会出现乱码。同时,我们应该注意到 servlet 作为控制器是不应该输出内容的,我们应该把要打印的内容放到 JSP 文件中。

    浅谈jsp文件和HTML互相引入的乱码问题

    乱码问题通常与页面的编码格式有关,因此解决乱码问题的关键在于正确设置和统一页面编码。 JSP页面引入HTML文件时,虽然JSP页面的内容可以正确显示,但引入的HTML文件中可能出现乱码。为了解决这一问题,需要在HTML...

    浅谈java中字节与字符的区别

    同时,了解Java IO流中的编码和解码机制,可以帮助我们更有效地处理文本数据的读写操作,避免出现编码问题。总之,掌握字节和字符的概念以及它们在Java中的应用,是每个Java开发者必备的基础知识。

    JAVA自学之路

    经常的进行知识难点的查询,如果一个问题牵扯的面比较广,就干脆到网上搜索一些相关的专题,比如“java 乱码 mysql” “oracle 创建用户”等等,如果有必要,不要犯懒,勤动手写一些小小的测试程序,来弄明白知识点...

    浅谈Android Studio导出javadoc文档操作及问题的解决

    "浅谈Android Studio导出javadoc文档操作及问题的解决" Android Studio是当前Android应用开发的主流IDE之一,但是在实际开发中,我们经常需要生成javadoc文档以便于其他开发者或团队成员了解我们的代码结构和设计...

    浅谈HTML的doctype和编码

    本文将详细探讨doctype声明的作用以及如何设置HTML文档的字符编码,以及在处理中文乱码问题时应采取的解决方案。 ### Doctype声明的作用 DOCTYPE(文档类型声明)是HTML文档的第一行代码,它的作用是告知浏览器...

    浅谈mysql导出表数据到excel关于datetime的格式问题

    此外,值得注意的是,由于MySQL的表可能采用UTF-8编码,而Excel可能默认使用GBK编码,为了避免导出的Excel文件打开时出现乱码,需要在`INTO OUTFILE`语句中指定字符集为GBK。这确保了数据导出后能正确显示。 补充一...

    浅谈常用计算机编程语言的分析和选用技巧-论文

    在需要高保密性的领域中,如电子商务系统和金融系统,Java语言需要面对“乱码”这一主要问题。 最后,汇编语言是控制计算机硬件最直接的编程语言,它具有强大的功能性,能够直接控制硬件设备。汇编语言的代码编译和...

    SSM宠物领养系统开题报告.doc

    浅谈Java中Mysql数据库的连接与操作[J]. 信息记录材料, 2020, 21(02): 144-145. [4] 郑智方, 魏恺乐, 李彬, 谢易壮. MySQL得到广泛使用的原因及其嵌入式应用[J]. 科技风, 2020(05): 114. [5] 赵秀芹, 刘杨青, 李...

    浅谈中文SSID无线网络设置方法

    然而,无线网络的安全性问题也随之凸显,容易遭到未经授权的用户蹭网。本文将探讨如何通过设置中文SSID来增强无线网络的安全性,以及如何在不支持中文SSID的设备上实现这一设置。 SSID,全称为Service Set ...

    浅谈Mysql如何处理表情,MySql如何存储表情

    当你尝试在MySQL中存储表情时,由于utf8编码的限制,它们通常会被错误地转换为四个字节的乱码,导致数据丢失。 为了解决这个问题,MySQL引入了一个新的字符集——utf8mb4。"mb4"代表“四字节多字节”,这个编码能够...

Global site tag (gtag.js) - Google Analytics