锟斤拷
今天不是聊我新取的ID——虽然它真是很酷的一个,又来聊乱码问题了。相信每一个在非英语环境中工作的程序员都受到过乱码的困扰,做为程序员,简单的说,应始终意识到在内存中字符串是以Unicode方式表示的,在I/O时尽量使用UTF-8编码(除了在中文Windows控制台输出时不得已而使用GBK/GB18030),当遇到不可控制的外部系统使用了其他编码方式时,使用恰当的方法进行解码。 Unicode的基本多文种平面(Basic Multilingual Plane,BMP),即UCS-2,共有216=65536个字符,能够满足绝大多数使用需求,另外的补充多文种平面(Supplementary Multilingual Plane,SMP),即UCS-4,更是提供了231=2147483648个地址空间(UCS-4的首位恒为0),实际上在Unicode标准中已经定义了超过10万个字符,提供给全体地球人使用。 考虑以下Java代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 logger.info("当前JRE版本:" + System.getProperty("java.version")); logger.info("当前默认字符集:" + Charset.defaultCharset()); String str = "UTF-8字符"; byte[] bytes = {(byte) 0xC0, (byte) 0xC0}; try { byte[] b1 = str.getBytes("ISO-8859-1"); logger.info("使用ISO-8859-1编码:{}", toHexStr(b1)); logger.info("使用UTF-8解码并转为Unicode字符串:{}", new String(b1, "UTF-8")); String s1 = new String(bytes, "UTF-8"); logger.info("使用UTF-8解码并转为Unicode字符串:{}", s1); b1 = s1.getBytes(); logger.info("使用UTF-8编码:{}", toHexStr(b1)); logger.info("使用GB18030解码并转为Unicode字符串:{}", new String(b1, "GB18030")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } 输出为: ...