有关java的unicode编码的问题,大家帮忙

05-09-16 dongzw
1:从网络上来的数据是byte流,包含二进制数据,我该如何读取才能不破坏数据的完整性。

2:是不是所有的文件都是偶数个byte的大小

3:从一个流里read char或者string的时候,java是直接的将两个byte作为一个char还是对于单独的每个byte编码为一个char

banq
2005-09-16 09:26
要看对方从网络上传过来的是什么编码,一般你最好做个过滤器,将对方编码转换成UTF-8,在你自己内部统一成UTF-8

Kyle_Yin
2005-09-16 14:09
UNICODE编码并不是简单的每自符两字节. 实际上多数中文字符在所谓"扩展平面", 是三字节或者更多. 具体是两字节一个字符还是三字节一个字符是靠前行字节的值来确定的.

不要试图手工做解码.

重要原则是确保通信双方用同样的编码.

1. 如果双方都是JAVA程序, 用 SOCKET + PrintStream 通信, 那么打开STREAM时, 明确指定编码:

PrintStream(OutputStream out, boolean autoFlush, String encoding)

InputStreamReader(InputStream in, String charsetName)

用UTF-8作encoding/charset参数.

2. 双方都是JAVA程序, 用 ObjectStream 通信, 应该直接就可以WORK. String 对象内部状态里有编码信息.

3. 流览器对JAVA程序:

输出(JSP, SERVLET): 指定 content="text/html; charset=UTF-8"

输入: 首先确保服务器支持UTF-8编码. WEBLOGIC缺省状态即支持UTF-8. WEBSPHERE要手工设置: default.client.encoding=UTF-8 或者 client.encoding.override=UTF-8. 这样, 从HTTPServletRequest.getParameter()读出的直接就是正确编码的STRING.

4. 或者, 用LATIN-1 (ISO-8859-1)编码, 双方都读/写"raw data", 然后通过STRING的API:

byte[] String.getBytes(String encoding)和

constructor String(byte[], String charset)

映射到UTF-8.

5. legacy 对JAVA通信: 要具体研究了. 呵呵.

Kyle_Yin
2005-09-16 14:12
对了, 在流览器情况下, 还要确定流览器本身支持UTF-8编码, 客户端输入使用UTF-8编码.

SERVER端RENDER出去的URL需要经过 RLEncoding.encode(String url)处理.

猜你喜欢