现在的位置: 首页 > 综合 > 正文

Java中文乱码

2013年08月19日 ⁄ 综合 ⁄ 共 1364字 ⁄ 字号 评论关闭

1:编码方式

阶段一  ASCII 计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。 英文 DOS

阶段二  ANSI编码
       (本地化) 为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。
不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。 中文 DOS,中文 Windows 95/98,日文 Windows 95/98

阶段三 UNICODE
(国际化) 为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。

C++和java中数据类型及编码

类型或操作

 C++   

 Java

 字符  wchar_t  

 char

字节  char byte
ANSI 字符串 char[] byte[]
UNICODE 字符串 wchar_t[] String
字节串→字符串 mbstowcs(), MultiByteToWideChar() string = new String(bytes, "encoding")
字符串→字节串 wcstombs(), WideCharToMultiByte() bytes = string.getBytes("encoding")

从上边知道

Java 中的 char 代表一个“UNICODE 字符(宽字节字符)”,而 C++ 中的 char 代表一个字节;

Java 中字符串类 String 中的内容是 UNICODE 字符串;

二:JSP及Java程序中的传送编码方式

JSP页中加如下语句

<%@ page language="java" pageEncoding="GBK"%>

其中pageEncoding是当jsp转译成_jsp.java时使用的encoding.预设是iso8859_1.

当_jsp.java编译成_jsp.class是使用utf-8作为encoding.

<%@ page contentType="text/html;charset=GBK" %>

输出到浏览器时的文件格式和编码方式,预设是iso8859_1;

也可以直接调用response.setContentType("text/html; charset=GBK")来设定,但是必须在传回任何结果之前调用,否则不起作用。

三:传送数据时,不同的传送方式的处理方法

使用GET 的方式:
String test = new String((request.getParameter("test")).getBytes("ISO-8859-1"),"GBK");

使用POST 的方式:
request.setCharacterEncoding("GBK");

注意,其中的GBK的编码与页面的pageEncoding必须一致,如果页面的编码是UTF-8,那么这里也应该把GBK改成UTF-8,否则同样会乱码

抱歉!评论已关闭.