首页 > 开发 > JAVA > 正文

初学者请教关于java编码的问题

2017-09-07 09:24:16  来源:网友分享

很简答的的示例程序,大家看下

我的问题是,我不明白,文件的明明是0-50000这些数字,为什么文件打开以后,里面是各种各样的符号呢,有中文,英文,日文等等各种字符。
我能知道是unicode编码的原因,但是不是很清楚原理
请各位帮忙解释下,或者给个详细解释这个的链接之类的更好。

非常感谢!

解决方案

由于你的参数类型为 int ,所以你实际调用的应该是 OutputStreamWriter.write(int)

这个函数的作用是“Writes a single character”。也就是说你写入的是一个直接的字节。

你没有搞清楚“编码”这个概念。“编码”就是把各种信息保存到计算机中的方式。因为计算机是只能处理数字的,所以所有的符号(这里指 A-Z a-z 中文 数字等)都需要有一个对应的“编码”。

小实验:

写一个 Java 程序,里面有:

for (int i = 48; i < 58; i++) {  fw.write(i);}

然后用记事本打开你写入的那个文件,你看到了什么?

你应该看到“0123456789”,因为 48 - 57 对应的正好是 '0' - '9' 的 ASCII 码。完整的 ASCII 码表见 http://zh.wikipedia.org/zh-cn/ASCII

下载一个 16 进制编辑器,这里推荐 HxD 打开你之前生成的那个 unicode.dat 文件。你看到的东西应该是类似这样的:

0000000: 0001 0203 0405 0607 0809 1011 1213 1415  ................0000010: 1617 1819 2021 2223 2425 2627 2829 3031  .... !"#$%&'()010000020: 3233 3435 3637 3839 4041 4243 4445 4647  23456789@ABCDEFG0000030: 4849 5051 5253 5455 5657 5859 6061 6263  HIPQRSTUVWXY`ab

你会发现该文件从第一个字节开始每个字节正好是 0 1 2 3 ...

计算机的每个字节可以表示一个 0 - 255 的数字,那每个数字代表什么含义呢?这就是编码赋予的。

也就是说,你把计算机中处理的“数字”,和编码中作为“符号”的那个“数字”搞混了,在 ASCII 码中恰好有 '0' - '9' 这 9 个数字,但它们是作为符号的,它们的编码是 48 - 57 。

在 Java 中,可以用类型来区别。直接的那个数字是 int 型,而作为符号的是 char 或 String 型。

至于为什么会出现乱码,这是因为记事本把文本文件按照 gbk 来解释,而 gbk 中有中文、日文之类的符号。

关于 Unicode 和各种编码,推荐一篇文章:

字符编解码的故事(ASCII,ANSI,Unicode,Utf-8区别)

那如何才能实现你想实现的功能呢?

可以用 Writer.write(String) 方法:

fw.write(Integer.toString(i) + " " );