请教各位大神一个问题,这个问题在大脑里呆了很久了。。。

qq_29448025 2017-05-05 07:40:16
	public static void main(String[] args) throws IOException {
char a='中'; //在内存中用unicode编码,占2个字节
System.out.println((int)a); //unicode码为20013
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("data.txt"),"UTF-8");
osw.write(a); //写完后文件大小为3字节
osw.close();
}




我想请教大家的问题是:
1,能直接把字符(如'中‘)的unicode码写入文件吗?如果可以的话,会带来两个好处,一是可以节省磁盘容量(unicode编码为2字节),二是以后再从文件中读字符到内存中,也更直接明了,不需要转换了。
2、如果不能,那是因为什么原因呢?
3、计算机是怎么查找到字符对应的unicode编码(如'中'的编码为20013)和UTF-8编码的,是不是因为计算机内部中有一张对照表吗,根据对照表找到的呀?
4、编译后的程序字节码文件中,字符'中'表现出来的是'中’本身,还是已被转化成其unicode码了呢?
...全文
551 8 打赏 收藏 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pqdong 2017-05-13
  • 打赏
  • 举报
回复
引用 2 楼 zc881124 的回复:
中 unicode 十进制为 20013 二进制为 01001110 00101101 对应16进制就是4E2D 对照unicode和utf-8的转换关系 UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。 UTF-8的编码规则很简单,只有二条: 1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。 2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。 下表总结了编码规则,字母x表示可用编码的位。 Unicode符号范围 | UTF-8编码方式 (十六进制) | (二进制) --------------------+--------------------------------------------- 0000 0000-0000 007F | 0xxxxxxx 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 它应该对应弟三类,就是三个字节表示。 对应的utf-8 应该是:11100100 10111000 10101101
----------------分割------------- 关于第三点2楼已经很详细,若想理解的更透彻可以参考《JAVA核心技术 卷1》3.3.4Unicode和char类型。3.3.6码点和代码单元 关于第四点:以Unicode码存储 JAVA的一大特点是可移植性,对字符串采用标准的Unicode格式存储,同时还具有体系结构中立性, 即编译器生成与计算机体系结构无关的字节码指令(.class)文件 个人理解,望斧正。
110成成 2017-05-10
  • 打赏
  • 举报
回复
引用 5 楼 qq_29448025 的回复:
[quote=引用 3 楼 zc881124 的回复:] 1:utf-8 的出现就是避免浪费,采用不定长表示。 3:unicode 和utf-8 之间有一个对应的转换关系,见我上一个回复展示的。 4:没听懂你的意思。
谢谢层主这么热心的回答。 但还是有点疑问想请教 1:utf-8 的出现就是避免浪费,采用不定长表示。那汉字的话,unicode总是用2字节表示,而utf-8有的用2个字节、有的用3个字节表示,这岂不是更浪费。 4:以.java结尾的源文件编译后会生成相应的.class文件,我想请教的是'中‘在.class文件中是用字面量'中'表示还是用其unicode表示?[/quote] 这是我搜藏的一个帖子,讲的很详细,你自己参考下,我觉得帖子讲的额很详细 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
qq_29448025 2017-05-10
  • 打赏
  • 举报
回复
引用 6 楼 zc881124 的回复:
[quote=引用 5 楼 qq_29448025 的回复:] [quote=引用 3 楼 zc881124 的回复:] 1:utf-8 的出现就是避免浪费,采用不定长表示。 3:unicode 和utf-8 之间有一个对应的转换关系,见我上一个回复展示的。 4:没听懂你的意思。
谢谢层主这么热心的回答。 但还是有点疑问想请教 1:utf-8 的出现就是避免浪费,采用不定长表示。那汉字的话,unicode总是用2字节表示,而utf-8有的用2个字节、有的用3个字节表示,这岂不是更浪费。 4:以.java结尾的源文件编译后会生成相应的.class文件,我想请教的是'中‘在.class文件中是用字面量'中'表示还是用其unicode表示?[/quote] 这是我搜藏的一个帖子,讲的很详细,你自己参考下,我觉得帖子讲的额很详细 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html[/quote] 谢谢!
qq_29448025 2017-05-09
  • 打赏
  • 举报
回复
引用 3 楼 zc881124 的回复:
1:utf-8 的出现就是避免浪费,采用不定长表示。 3:unicode 和utf-8 之间有一个对应的转换关系,见我上一个回复展示的。 4:没听懂你的意思。
谢谢层主这么热心的回答。 但还是有点疑问想请教 1:utf-8 的出现就是避免浪费,采用不定长表示。那汉字的话,unicode总是用2字节表示,而utf-8有的用2个字节、有的用3个字节表示,这岂不是更浪费。 4:以.java结尾的源文件编译后会生成相应的.class文件,我想请教的是'中‘在.class文件中是用字面量'中'表示还是用其unicode表示?
110成成 2017-05-05
  • 打赏
  • 举报
回复
1:utf-8 的出现就是避免浪费,采用不定长表示。 3:unicode 和utf-8 之间有一个对应的转换关系,见我上一个回复展示的。 4:没听懂你的意思。
110成成 2017-05-05
  • 打赏
  • 举报
回复
中 unicode 十进制为 20013 二进制为 01001110 00101101 对应16进制就是4E2D 对照unicode和utf-8的转换关系 UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。 UTF-8的编码规则很简单,只有二条: 1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。 2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。 下表总结了编码规则,字母x表示可用编码的位。 Unicode符号范围 | UTF-8编码方式 (十六进制) | (二进制) --------------------+--------------------------------------------- 0000 0000-0000 007F | 0xxxxxxx 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 它应该对应弟三类,就是三个字节表示。 对应的utf-8 应该是:11100100 10111000 10101101
自由自在_Yu 2017-05-05
  • 打赏
  • 举报
回复
1、能 3、是 4、unicode码
朔北冥 2017-05-05
  • 打赏
  • 举报
回复
一种编码格式就是为了能够编码和译码。。。。。 我猜还是有结束标志位。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧