Tob*_*bbe 14 java encoding iso-8859-1
运行以下(示例)代码
import java.io.*;
public class test {
public static void main(String[] args) throws Exception {
byte[] buf = {-27};
InputStream is = new ByteArrayInputStream(buf);
BufferedReader r = new BufferedReader(
new InputStreamReader(is, "ISO-8859-1"));
String s = r.readLine();
System.out.println("test.java:9 [byte] (char)" + (char)s.getBytes()[0] +
" (int)" + (int)s.getBytes()[0]);
System.out.println("test.java:10 [char] (char)" + (char)s.charAt(0) +
" (int)" + (int)s.charAt(0));
System.out.println("test.java:11 string below");
System.out.println(s);
System.out.println("test.java:13 string above");
}
}
Run Code Online (Sandbox Code Playgroud)
给了我这个输出
test.java:9 [byte] (char)? (int)63 test.java:10 [char] (char)? (int)229 test.java:11 string below ? test.java:13 string above
如何在第9行打印输出中保留正确的字节值(-27)?并因此接收System.out.println(s)命令的预期输出(å).
Jon*_*eet 22
如果要保留字节值,请不要使用Reader,理想情况下.要在文本中表示任意二进制数据并在以后将其转换回二进制数据,您应该使用base16或base64编码.
但是,要解释发生了什么,当您s.getBytes()使用默认字符编码调用时,显然不包含Unicode字符U + 00E5.
如果你s.getBytes("ISO-8859-1")到处打电话而不是s.getBytes()我怀疑你会得到正确的字节值...但依靠ISO-8859-1这是有点脏的IMO.
如上所述,getBytes()(无参数)使用Java平台默认编码,可能不是ISO-8859-1.如果你的终端和默认编码匹配并支持角色,只需打印就可以了.例如,在我的系统上,终端和默认Java编码都是UTF-8.你看到'?'的事实 表示您的不匹配或不支持.
如果要在系统上手动编码为UTF-8,请执行以下操作:
String s = r.readLine();
byte[] utf8Bytes = s.getBytes("UTF-8");
Run Code Online (Sandbox Code Playgroud)
它应该给出一个字节数组{-61, -91}.
| 归档时间: |
|
| 查看次数: |
74594 次 |
| 最近记录: |