00000007.htm

来自「水木清华BBS」· HTM 代码 · 共 201 行 · 第 1/2 页

HTM
201
字号
对象也可以用同样的方法从构造函数中获得.&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>READING/WRITING&nbsp;UNICODE&nbsp;USING&nbsp;I/O&nbsp;STREAM&nbsp;ENCODINGS&nbsp;<BR>&nbsp;<BR>与常用的其他语言不同&nbsp;Java&nbsp;使用双字节的&nbsp;Unicode&nbsp;字符集.&nbsp;这样做带来的问题是:&nbsp;<BR>Java的字符集是如何在磁盘文件上存储的,&nbsp;并且&nbsp;Java&nbsp;如何使用现有的大量&nbsp;ASCII&nbsp;<BR>格式的数据?&nbsp;<BR>&nbsp;<BR>早期的&nbsp;JDK(tm)&nbsp;,&nbsp;比如&nbsp;1.0.2&nbsp;版本,&nbsp;中这个问题没有得到解决.&nbsp;例如:&nbsp;<BR>DataInputStream.readLine&nbsp;方法用于读取整行的输入,&nbsp;但他无法正确的将字节转化为&nbsp;<BR>字符,&nbsp;因此已被废弃.&nbsp;在&nbsp;Unicode&nbsp;得到广泛的使用前,&nbsp;这个问题仍然是重要的.&nbsp;<BR>&nbsp;<BR>解决问题之道是使用&nbsp;Reader&nbsp;和&nbsp;Writer&nbsp;这一对&nbsp;I/O&nbsp;类.&nbsp;他们是基于字节流的&nbsp;<BR>(如同FileInputStream),&nbsp;并且实现字符,&nbsp;字节的双向转换.&nbsp;<BR>&nbsp;<BR>下面的程序可以得到系统的缺省转换格式:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;encode&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;p&nbsp;=&nbsp;System.getProperty(&quot;file.encoding&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(p);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>在我的机器和&nbsp;Java&nbsp;2&nbsp;软件上,&nbsp;输出为&nbsp;&quot;GBK&quot;,&nbsp;这个格式为:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GBK,&nbsp;Simplified&nbsp;Chinese&nbsp;<BR>&nbsp;<BR>对于&nbsp;encodings&nbsp;的表格可以从如下获得:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF="http://java.sun.com/products/jdk/1.1/intl/html/intlspec.doc7.html">http://java.sun.com/products/jdk/1.1/intl/html/intlspec.doc7.html</A>&nbsp;<BR>&nbsp;<BR>如果你希望直接指定转换方式,&nbsp;下面的程序就是范例,&nbsp;他将Unicode字母表中的所有小写字母写入文件。&nbsp;&nbsp;<BR>在这些字母中,&nbsp;有一些的高字节是非零的(就是那些大于'\u00ff'的字母),因此正确的转化十分重要。&nbsp;<BR>这里使用的方式为&nbsp;UTF-8,&nbsp;他能够将ASCII字符转换为单字节字符,而其他字符仍然保持两到三个字节。&nbsp;<BR>&nbsp;<BR>import&nbsp;java.io.*;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>public&nbsp;class&nbsp;enc1&nbsp;{&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream&nbsp;fos&nbsp;=&nbsp;new&nbsp;FileOutputStream(&quot;out&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStreamWriter&nbsp;osw&nbsp;=&nbsp;new&nbsp;OutputStreamWriter(fos,&nbsp;&quot;UTF8&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;c&nbsp;=&nbsp;'\u0000';&nbsp;c&nbsp;&lt;=&nbsp;'\uffff';&nbsp;c++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!Character.isLowerCase((char)c))&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;osw.write(c);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;osw.close();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(e);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;}&nbsp;<BR>}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>相反的转换过程如下;&nbsp;<BR>&nbsp;<BR>import&nbsp;java.io.*;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>public&nbsp;class&nbsp;enc2&nbsp;{&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;fis&nbsp;=&nbsp;new&nbsp;FileInputStream(&quot;out&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStreamReader&nbsp;isr&nbsp;=&nbsp;new&nbsp;InputStreamReader(fis,&nbsp;&quot;UTF8&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;c&nbsp;=&nbsp;'\u0000';&nbsp;c&nbsp;&lt;=&nbsp;'\uffff';&nbsp;c++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!Character.isLowerCase((char)c))&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ch&nbsp;=&nbsp;isr.read();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(c&nbsp;!=&nbsp;ch)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;error&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;isr.close();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(e);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;}&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>InputStreamReader&nbsp;和&nbsp;OutputStreamWriter&nbsp;是用于字节流域字符流进行相互转化的类。&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>--&nbsp;<BR>Write&nbsp;once,douche&nbsp;anywhere.&nbsp;<BR>&nbsp;<BR>※&nbsp;来源:·BBS&nbsp;水木清华站&nbsp;bbs.net.tsinghua.edu.cn·[FROM:&nbsp;210.78.133.83]&nbsp;<BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?