常见编解码问题

本文全面介绍了常见的字符编码标准,包括ASCII、ISO-8859-1、GB2312、GBK、UTF-8及UTF-16等,并详细阐述了在不同场景下如文件读写、URL处理、HTTP请求响应及数据库访问中的编码实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ASCII 单字节128个编码
ISO-8859-1 对ASCII的扩展,单字节256编码
GB2312 双字节编码,支持6763个汉字
GBK 双字节编码,GB2312的增强版
UTF-16 Unicode统一编码,定长双字节编码,简单但浪费空间
UTF-8 Unicode统一编码,不定长字节编码

不设置charset,默认应用系统设置的编码,这样很容易造成乱码

文件write时编码
FileOutputStream fos = new FileOutputStream(“C:/test.txt”);
OutputStreamWriter ow = new OutputStreamWriter(fos, “UTF-8”);
try{
ow.write(“这是要写入的中文”);
}catch(exception e){
//todo
}finally{
ow.close();
}

文件read时解码
FileInputStream fis = new FileInputStream(“C:/test.txt”);
InputStreamReader ir = new InputStreamReader(fis, “UTF-8”);
StringBuffer sb = new StringBuffer();
Char[] buf = new char(64);
Int Count = 0
try{
while( (count = ir.read(buf)) != -1 ){
Sb.append(bug);
}
}finally{
ir.close();
}

字符串编解码
String s = “这是中文测试”;
byte[] b = s.getBytes(“UTF-8”);
String n = new String(b, “UTF-8”);

Charset cs = Charset.forName(“UTF-8”);
ByteBuffer b = cs.encode(string);
CharBuffer cb = cs.decode(b);

URL中的编解码
tomcat的server.xml中配置解析URI的字符串编码,不设置默认用ISO-8859-1
时用head的ContentType定义的charset,否则用ISO-8859-1

Http Header的编解码
一般不要包含非ASCII字符. 如果有非ASCII字符,需要先应用URLEncoder编码,再写入header;到服务器端再对它进行按照设置的编码来解码

POST表单的编解码
按照head的ContentType定义的charset来编解码,在服务器端,可以在第一次getParameter之前要设置request.setCharacterEncoding(charset)
属性enctype=multipart/form-data,即上传文件的编码,也是用ContentType定义的charset

HTTP Body的编解码
response返回给客户端是通过response.setCharacterEncoding(charset)来设置,它将会覆盖request.getCharacterEncoding的值,并通过Header的ContentType返回给客户端
如果返回的Header没有设置ContentType,那页面只能通过HTML的head中的charset来解码,如果这个也没有,则通过默认的编码来解码

JDBC访问数据库的编解码
通过JDBC的URL来设定编码,例如MYSQL: url=”jdbc:mysql://localhost:3306/DB?useUnicode=true&characterEncoding=GBK”

JS文件的编码
需要在属性设置charset=”UTF-8”来编码
encodeURI()将整个URL的字符(ASCII除外)进行UTF-8编码,并在每个码值之前加%
decodeURI()是和encodeURI对应的UTF-8解码
当URL作为参数时,需要对大部分字符编码,encodeURI()不合适,所以要用增强版encodeURIComponect()来编码,对应的用decodeURIComponect()来解码

JAVA处理URL编解码
URLEncoder&URLDecoder将所有加%的UTF-8码值用UTF-8解码,得到原始字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值