字符编码小研究

标签: 字符编码 研究 | 发表时间:2013-02-20 12:44 | 作者:
出处:http://www.iteye.com
在Grails项目中,实现国际化,遇到了中文乱码的问题,几经学习问题解决了。本着打破砂锅的精神,又折腾到凌晨2点,初步研究了一下字符编码等知识。

====基础====

---ANSI---
字符编码:
ASCII = 英文字母编码
GB2312 = ASCII + 简体编码(对ASCII的中文扩展)
Big5 = ASCII + 繁体编码
(还有针对日语、韩语等字符编码)
以上统称为ANSI,也就是操作系统的默认编码


---Unicode---
Unicode:万国码,任何字符都是2个字节
UTF-8:Unicode的“英文”压缩形式,经过一定算法的转换,英文只用1个字节,汉字用3个字节。所以适合英文为主的网站。
UTF-16:不压缩,任何字符都是2个字节,看似适合中文为主的网站,但仔细想想HTML语言又包含大量英文,所以还是用GB2312比较合适(英文1字节、中文2字节)。
注:UTF主要是互联网兴起后,需要考虑传输效率才出现的。


---测试---
用记事本输入“严严”,另存为的时候选择不同的编码,在用UE查看16进制

文件头 内容
ANSI D1 CF  D1 CF
Unicode FF FE 25 4E  25 4E
Unicode-B FE FF 4E 25  4E 25
UTF-8 EF BB BF E4 B8 A5  E4 B8 A5


超级混淆:这里的Unicode(保存格式)其实意思是UTF-16-Little-Endian(小尾、逆序),而Unicode-B和Unicode(原始编码)在编码上是一致的。
Mac中使用大尾格式,Windows或Linux使用小尾格式。

---文件头---
如果没有文件头,操作系统就会以默认的ANSI进行解码。
UTF-8的文件头,其实就是Unicode-B的文件头进行UTF-8算法得来的:FEFF --> EFBBBF。所以UTF-8也是顺序的。


====JAVA====
Java因为其跨平台的需求,在内部运算中,涉及到的所有字符串都会被转化为unicode来进行运算。
所以代码都以UTF-8来存放,就最不容易出现乱码问题。



---native2ascii---
JDK提供了将“字符”转化为“unicode编码”的工具

txt文件保存的内容“严严”

C:\Users\Calvin\Desktop\test1>native2ascii ANSI.txt ANSI.ascii.txt
\u4e25\u4e25

连文件头也编码了。。。是不是有点多余。。
C:\Users\Calvin\Desktop\test1>native2ascii -encoding utf-8 utf8.txt utf8.ascii.txt
\ufeff\u4e25\u4e25

乱码:因为utf8.txt是utf-8格式的,而没有指定-encoding参数,就会以系统默认的ANSI去解析,就出现错误
C:\Users\Calvin\Desktop\test1>native2ascii utf8.txt utf8.ascii2.txt
\u9518\u5938\u5f17\u6d93\ufffd




====Grails i18n====
1. 字典:位于grails-app/i18n下,默认会创建好几种语言的属性文件,我们只需要保留messages.properties和messages_zh_CN.properties即可
2. 使用:gsp页面中,<g:message code="company.name"/>
3. 自动识别:默认是以浏览器的设置进行语言的识别

4. 手动选择:
    <div class="right">
         <g:link url="${request.requestURI}?lang=en_US">English</g:link>
       | <g:link url="${request.requestURI}?lang=zh_CN">中文</g:link>
    </div>


中文乱码问题
1. 检查发现messages_zh_CN.properties是GBK编码的,所以会被读成乱码
2. 解决办法,仍然是GBK编码,但是将中文转化为unicode
company.name=\u516c\u53f8
   但这样编辑起来很痛苦
3. 也可以将properites文件保存为UTF-8格式
company.name=公司
   这样即方便编辑,又不会有乱码
注:但保存为UTF-16是不行的,网上都说properites文件只能用unicode保存中文,我推测是Grails做了类似工作来兼容UTF-8的格式。
Properties prop=new Properties();         
prop.load(new InputStreamReader(Client.class.getClassLoader().getResourceAsStream("config.properties"), "UTF-8"));




参考
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [字符编码 研究] 推荐:

字符编码小研究

- - ITeye博客
在Grails项目中,实现国际化,遇到了中文乱码的问题,几经学习问题解决了. 本着打破砂锅的精神,又折腾到凌晨2点,初步研究了一下字符编码等知识. ASCII = 英文字母编码. GB2312 = ASCII + 简体编码(对ASCII的中文扩展). Big5 = ASCII + 繁体编码. (还有针对日语、韩语等字符编码).

字符编码

- - 博客 - 伯乐在线
伯乐在线注:本文来自文章作者 @acmerfight 的投稿( 原文链接). 如果其他朋友也想投稿,请发邮件至 [email protected],或直接给 @伯乐在线官方微博 私信投递. 你是否认为“ASCII码 = 一个字符就是8比特”. 你是否认为一个字节就是一个字符,一个字符就是8比特.

前端开发中HTML与javascript的常用字符编码

- mingelz - UED TEAM,用户体验设计,web前端开发
在日常的前端开发工作中,我们会经常的与HTML、javascript、css等语言打交道,和一门真正的语言一样,计算机语言也有它的字母表、语法、词法、编码方式等,在这里我简单的谈一下前端HTML与javascript日常工作中常碰到的编码问题. 在计算机中,我们储存的信息都是用二进制码表示的. 我们认识的、屏幕上显示的英文、汉字等符号和储存用的二进制代码的互相转换,就是编码.

浅析白盒审计中的字符编码及SQL注入

- - FreeBuf.COM
尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范. 但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如gbk,作为自己默认的编码类型. 也有一些cms为了考虑老用户,所以出了gbk和utf-8两个版本.

字符编码笔记:ASCII,Unicode和UTF-8

- - 移动开发 - ITeye博客
今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚. 下面就是我的笔记,主要用来整理自己的思路. 但是,我尽量试图写得通俗易懂,希望能对其他朋友有用. 毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识.

字符编码详解——彻底理解掌握编码知识,“乱码”不复存在

- - 编程语言 - ITeye博客
每一个程序员都不可避免的遇到字符编码的问题,特别是做Web开发的程序员,“乱码问题”一直是让人头疼的问题,也许您已经很少遇到“乱码”问题,然而,对解决乱码的方法的内在原理,您是否明白. 本人作为一个程序员,在字符编码方面同样遇到不少问题,而且一直对各种编码懵懵懂懂、不清不楚;在工作中也曾经遇到一个很烦人的编码问题.

用户研究

- - 技术改变世界 创新驱动中国 - 《程序员》官网
介绍自己的设计流程时,设计师通常都说它是“以人为中心”或是“以用户为中心”的. 笼统地讲,这表示设计师经常要考虑所设计产品的潜在用户,尽力为这些人创造出最好的产品. 这个问题看似简单,实际上却不好回答. 好的设计通常都是从用户研究着手的. 我们如何才能发现人们想要实现的目标. 虽然这样做有时会得到一些有用的信息,但一定要小心地评估人们给出的答案.

JVM研究

- - 开源软件 - ITeye博客
每天接客户的电话都是战战兢兢的,生怕再出什么幺蛾子了. 我想Java做的久一点的都有这样的经历,那这些问题的最终根结是在哪呢. JVM全称是Java Virtual Machine,Java虚拟机,也就是在计算机上再虚拟一个计算机,这和我们使用 VMWare不一样,那个虚拟的东西你是可以看到的,这个JVM你是看不到的,它存在内存中.

BigPipe学习研究

- maxiyun - 搜索技术博客-淘宝
技术背景 FaceBook页面加载技术. 试想这样一个场景,一个经常访问的网站,每次打开它的页面都要要花费6 秒;同时另外一个网站提供了相似的服务,但响应时间只需3 秒,那么你会如何选择呢. 数据表明,如果用户打开一个网站,等待3~4 秒还没有任何反应,他们会变得急躁,焦虑,抱怨,甚至关闭网页并且不再访问,这是非常糟糕的情况.

Mysql缓存研究

- - CSDN博客推荐文章
缓存机制简单的说就是缓存sql文本及查询结果,如果运行相同的sql,服务器直接从缓存中取到结果,而不需要再去解析和执行sql. 如果表更改了,那么使用这个表的所有缓存查询将不再有效,查询缓存值的相关条目被清空. 更改指的是表中任何数据或是结构的改变,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改变了的表的使用MERGE表的查询.