Java字符转换问题


======================================================
注:本文源代码点此下载
======================================================

* 什么是字节流与字符流的转换? 什么时候会做转换?

字符就是char类型, 是双字节的, 用unicode, 一个char就是实际上的一个字符;字节就是byte类型, 是单字节的,实际的字符串根据编码不同,用单字节或者双字节来表示。

常用的string类型核心就是char[],string.length()就是char[]数组的大小,因此当encoding没有转换错误时,string长度是字符的个数,不管是中文还是英文。做字符处理的时候也从来不会出现截断半个字符的问题。

java内部都是用char的,但是很多时候做输入输出就要用byte stream,例如文件、数据库、网络。

当数据要从char变为byte,或者byte变成char时,就要做转换。

同样的内容,用不同的编码方式(encoding),byte stream是不同的,转换的时候需要指定使用的encoding。

jvm的file.encoding属性确定了jvm的缺省的编码/解码方式:从而影响应用中所有字节流==>字符流的解码方式 字符流==>字节流的编码方式。在不同os平台上,这是由locale决定的,缺省encoding在中文平台为gbk,英文平台为8859_1。

* utf8与unicode

准确的说,utf8不是unicode,它也只是一种编码方式,不过它的编码空间可以容纳unicode的所有字符。因此utf8是一种很适合于存储unicode的外码。utf8是变长编码,中文3字节。

* java i/o

reader和writer核心是char,inputstream和outputstream核心是byte。

专门有bridge类做reader/writer与inputstream/outputstream的转换:inputstreamreader/outputstreamwriter。

* 什么地方会发生转换?

从数据库到java程序 byte——〉char

从java程序到数据库 char——〉byte

从文件到java程序 byte——〉char

从java程序到文件 char——〉byte

从java程序到页面显示 char——〉byte

从页面form提交数据到java程序 byte——〉char

从流到java程序 byte——〉char

从java程序到流 char——〉byte

* 源程序中的字符串

最早的字节流解码过程从javac的代码编译就开始了,写在源文件中的字符串是按照一定的编码方式的(如gbk),java编译器根据缺省的encoding来对源代码中的字符串做解码,在java bytecode中存储为unicode char。

* 数据库中的字符编码方式

数据库中的东西都是二进制存放的,支持任何数据,理论上说,与编码并没有关系。不过,如果没有指定字符集,在排序、匹配的时候有问题,接口的地方也会出现问题。

因此就涉及到以什么编码方式来保存到数据库中了。平常我们用数据库工具或者其他程序写数据库时,都是直接用系统编码方式,也就是gbk。但是,jdbc在访问数据库时,缺省是用数据库的字符集,通常为8859_1的,本来应该是gbk->unicode却变成了8859_1->unicode,就会出现乱码。连接串中加上参数可以强制jdbc按照gbk做转换。

jdbc:mysql://localhost/test?useunicode=true&characterencoding=gbk

不过这样数据库还是只能支持gbk,如果写入big5码,同样会出现转换错误的问题。最佳方案还是用utf8来编码,这样可以容纳unicode所有字符,覆盖了gbk、big5等各个字符集的范围。

mysql原来不支持utf8,直到目前的最新版本4.1才加入unicode支持,但目前4.1版本还在alpha阶段。

* swing的字符集问题

从目前的试验看来,swing的组件会自动根据系统encoding做转换,并不需要干预。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值