50.html
来自「写给JSP初级程序员的书」· HTML 代码 · 共 509 行 · 第 1/2 页
HTML
509 行
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="description" content="Java,JDBC,EJB,Open Source,jdk,rmi">
<meta name="Keywords"
content="Java, servlets, Java servlet, Javascript, ActiveX, VRML,
applet, applets, directory, news, jdbc, applications,
Java applications, Java developer, Java development, developer,
classes, Jars.com, Jars, intranet, Java applet, Javabeans,
Java products, JDK, Java development kit, java development environment, JIT,
JavaPlan, enterprise tools, JVM, Java Virtual Machine, Java resources,
SUN, CGI, Perl, database, network, html,
xml, dhtml, rating, ratings, review, jars, cgi, programming,
software review, software rating">
<title>csdn_java中 中文问题详解</title>
<style>
.news { BACKGROUND: #007cd3; font-family: "宋体"; font-size: 9pt }
.t { font-family: "宋体"; font-size: 9pt }
.t1 { color:#007cd3; font-family: "宋体"; font-size: 9pt }
.white { font-family: "宋体"; font-size: 9pt;color:#FFFFFF }
.red { font-family: "宋体"; font-size: 9pt;color:#FF0000 }
A:visited {color:#0000FF}
A:hover {color: #ff6666; text-decoration: none}
.text {font-size: 12px; line-height: 160%; font-family: "宋体"}
.text1 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text1:visited {color:#000000}
.text1:hover {color: #000000}
.text2 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text2:visited {color:#000000}
.text2:hover {color: #000000}
.text3 {font-size: 12px; line-height: 100%; font-family: "宋体"; text-decoration: none}
.large {font-size: 14.8px; line-height: 130%}
</style>
</head>
<body
<center>
<tr>
<td WIDTH="100%" VALIGN="TOP">
<tr>
<td WIDTH="100%" CLASS="white"></td>
</tr>
<tr>
<td WIDTH="50%" bordercolor="#FFFFFF" CLASS="t1" bgcolor="#F0F0F0" align="center" nowrap>java中 中文问题详解 </td>
<p></p>
</tr>
<tr> <td WIDTH="100%" bordercolor="#FFFFFF" CLASS="t" bgcolor="#F0F0F0" colspan="2">
预备知识:
<br>
1.字节和unicode
<br>
Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式
<br>
是使用字节流的。 因此Java要对这些字节流经行转化。char是unicode的,而byte是字节.
<br>
Java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度,
<br>
可以用来告诉你,你用的Convertor。其中两个很常用的静态函数是
<br>
public static ByteToCharConverter getDefault() ;
<br>
public static ByteToCharConverter getConverter(String encoding);
<br>
如果你不指定converter,则系统会自动使用当前的Encoding,GB平台上用GBK,EN平台上用
<br>
8859_1
<br>
<br>
我们来就一个简单的例子:
<br>
"你"的gb码是:0xC4E3 ,unicode是0x4F60
<br>
你用:
<br>
--encoding="gb2312";
<br>
--byte b[]={(byte)'u00c4',(byte)'u00E3'};
<br>
--convertor=ByteToCharConverter.getConverter(encoding);
<br>
--char [] c=converter.convertAll(b);
<br>
--for(int i=0;i<c.length;c++)
<br>
--{
<br>
-- System.out.println(Integer.toHexString(c[i]));
<br>
--}
<br>
--打印出来是0x4F60
<br>
--但是如果使用8859_1的编码,打印出来是
<br>
--0x00C4,0x00E3
<br>
----例1
<br>
反过来:
<br>
--encoding="gb2312";
<br>
char c[]={'u4F60'};
<br>
convertor=ByteToCharConverter.getConverter(encoding);
<br>
--byte [] b=converter.convertAll(c);
<br>
--for(int i=0;i<b.length;c++)
<br>
--{
<br>
-- System.out.println(Integer.toHexString(b[i]));
<br>
--}
<br>
--打印出来是:0xC4,0xE3
<br>
----例2
<br>
--如果用8859_1就是0x3F,?号,表示无法转化 --
<br>
很多中文问题就是从这两个最简单的类派生出来的。而却有很多类
<br>
不直接支持把Encoding输入,这给我们带来诸多不便。很多程序难得用encoding
<br>
了,直接用default的encoding,这就给我们移植带来了很多困难
<br>
--
<br>
2.UTF-8
<br>
--UTF-8是和Unicode一一对应的,其实现很简单
<br>
--
<br>
-- 7位的Unicode: 0 _ _ _ _ _ _ _
<br>
--11位的Unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _
<br>
--16位的Unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
<br>
--21位的Unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
<br>
--大多数情况是只使用到16位以下的Unicode:
<br>
--"你"的gb码是:0xC4E3 ,unicode是0x4F60
<br>
--我们还是用上面的例子
<br>
-- --例1:0xC4E3的二进制:
<br>
-- -- 1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1
<br>
-- -- 由于只有两位我们按照两位的编码来排,但是我们发现这行不通,
<br>
-- -- 因为第7位不是0因此,返回"?"
<br>
-- --
<br>
-- --例2:0x4F60的二进制:
<br>
-- -- 0 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0
<br>
-- -- 我们用UTF-8补齐,变成:
<br>
-- -- 11100100 10111101 10100000
<br>
-- -- E4--BD-- A0
<br>
-- -- 于是返回0xE4,0xBD,0xA0
<br>
-- --
<br>
3.String和byte[]
<br>
--String其实核心是char[],然而要把byte转化成String,必须经过编码。
<br>
--String.length()其实就是char数组的长度,如果使用不同的编码,很可
<br>
--能会错分,造成散字和乱码。
<br>
--例:
<br>
----byte [] b={(byte)'u00c4',(byte)'u00e3'};
<br>
----String str=new String(b,encoding); ----
<br>
----如果encoding=8859_1,会有两个字,但是encoding=gb2312只有一个字 ----
<br>
--这个问题在处理分页是经常发生
<br>
4.Reader,Writer/InputStream,OutputStream
<br>
--Reader和Writer核心是char,InputStream和OutputStream核心是byte。
<br>
--但是Reader和Writer的主要目的是要把Char读/写InputStream/OutputStream
<br>
--一个reader的例子:
<br>
--文件test.txt只有一个"你"字,0xC4,0xE3--
<br>
--String encoding=;
<br>
--InputStreamReader reader=new InputStreamReader(
<br>
----new FileInputStream("text.txt"),encoding);
<br>
--char []c=new char[10];
<br>
--int length=reader.read(c);
<br>
--for(int i=0;i<c.length;i++)
<br>
----System.out.println(c[i]);
<br>
--如果encoding是gb2312,则只有一个字符,如果encoding=8859_1,则有两个字符
<br>
--------
<br>
--
<br>
--
<br>
<br>
----
<br>
2.我们要对Java的编译器有所了解:
<br>
--javac -encoding
<br>
我们常常没有用到ENCODING这个参数。其实Encoding这个参数对于跨平台的操作是很重要的。
<br>
如果没有指定Encoding,则按照系统的默认Encoding,gb平台上是gb2312,英文平台上是ISO8859_1。
<br>
--Java的编译器实际上是调用sun.tools.javac.Main的类,对文件进行编译,这个类 --
<br>
有compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。
<br>
编译器就是根据这个变量来读取java文件的,然后把用UTF-8形式编译成class文件。
<br>
一个例子:
<br>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?