UTF编码问题小结
在编程当中经常出现乱码的问题,而由此一般会引发很多惨剧,如读文件不成功、用户名显示乱码等,所以端午节抽了一小点时间好好看了一下编码问题,以备遗忘。
首先是中文编码,除了台湾和香港常用的BIG5,国内大概都用的是gb2312,这个可以从各大门户的首页源码中找到一些线索。还有一种叫gbk,这是微软对gb2312的拓展。主要由于gb2312只能表示6763个简体汉字,682个符号,具体可见字符区别。
然后是编程当中常见的utf编码,相信很多程序员都晕。比如我们最近在做android的NDK编程时,就发现由于写基础库的人没完全弄懂编码,导致中英文转码错误,从而引发一些列奇葩问题。由于char、wchar_t在语言层面、系统层面都没有统一的规范,如char在JAVA和C++中的字节数就不一样、wchar_t在win32和linux中的字节数也不一样,所以在网络传输时一般都会转换数据为utf编码。
多字符(一个字符用多个字节表示,即对应utf8、gb2312编码)与wchar_t(可能2个字节也可能4个字节,即对应utf编码中utf16和utf32)之间的转换主要是mbstowcs,wcstombs,MultiByteToWideChar,MultiByteToWideChar,前者是C运行时库,后者是windows的api,在windows下两者等效,前提是前者需要设置locael,否则中文转换会出问题。具体可见转换API。在android编程当中如果想在NDK使用转码,可以附加开源库ICU进行编译或者加载libicuuc.so,使用JNI回调也是一种方法,但显得很蠢。ios自带ICU,不过貌似私有,没做过调研,熟悉的同学可以补充.
utf8是变长编码,一般常见的字符可以在3个字节内表示,最多4个字节,因为4个字节可以用21(18+3)位来表示字符串,基本可以覆盖人类的任何语言了。具体编码细节网上可以查到很多资料,编码规则还是比较简单的。
utf16其实也是变长编码,每一个语言字都对应一个码位,一个抽象码位可以用1或者2个码元(code point)来表示,编码空间为U+0000到U+10FFFF,具体可参考utf16介绍。其中BMP主要对应于常见的语言字,这个空间内的字符可以用1个码元来表示,但只能表示63488个字符,无法覆盖人类所有语言。对于辅助平面内的码位,用BMP中2048个保留的码位拼成2个码元来表示。(虽然windows内核可以正确的处理BMP之外的字符,但windows的api只能处理BMP内的字符,原因就在于wchar_t的字节固定位为16位。java在JDK1.5之后对字符进行了增补,具体可见java编码,好奇的同学可以试试打印char值为0xD800到0xDFFF之间的值)。
另外一点是BOM,这个在较先进的编辑器中都会让用户选择,主要是来标示文本是否是大小端表示的。跟CRLF一样,在各个系统的表现形式不一样,多加注意就是了。
UTF编码问题小结的更多相关文章
- 利用zxing制作彩色,高容错,支持中文等UTF编码的QR二维码图片
利用zxing制作彩色,高容错,支持中文等UTF编码的QR二维码图片.代码如下 import java.awt.Color;import java.io.File;import java.util.H ...
- UTF编码检测
最近工作上正好需要进行UTF编码检测,自己写了一个,分享给大家,希望可以帮得上有需要用的朋友 public bool isUtf8(byte[] rawText) { bool result = tr ...
- Java中文&编码问题小结
转自:http://www.blogjava.net/zhugf000/archive/2005/10/09/15068.html Java字符编码转换过程说明 常见问题 JVM JVM启动后,JVM ...
- python --- 字符编码学习小结(二)
距离上一篇的python --- 字符编码学习小结(一)已经过去2年了,2年的时间里,确实也遇到了各种各样的字符编码问题,也能解决,但是每次都是把所有的方法都试一遍,然后终于正常.这种方法显然是不科学 ...
- UNICODE UTF编码方式解析
先明确几个概念 基础概念部分 1.字符编码方式CEF(Character Encoding Form) 对符号进行编码,便于处理与显示 常用的编码方式有 GB2312(汉字国标码 2字节) ASCII ...
- Delphi7中Unicode,ANSI,UTF编码问题
注解: ANSI 'American Standard Code for Information Interchange' 美国信息互换标准代码 ANSI的'Ascii'编码 Unicode ...
- Python编码问题小结
开门见山 decode的作用是将其他编码的字符串转换成Unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成Unicode编码. encode的 ...
- python --- 字符编码学习小结
上半年的KPI,是用python做一个测试桩系统,现在系统框架基本也差不多定下来了.里面有用到新学的工厂设计模式以及以及常用的大牛写框架的业务逻辑和python小技巧.发现之前自己写的代码还是面向过程 ...
- Java FTP下载文件以及编码问题小结
问题 之前在开发过程中,遇到了一点问题,我要访问一个FTP服务器去下载文件详细情况如下: 1. 需要传入一个可能为中文的文件名: 2. 通过文件名去FTP上寻找该文件: 3. FTP服务器的命名编码为 ...
随机推荐
- *[topcoder]LCMSetEasy
http://community.topcoder.com/stat?c=problem_statement&pm=13040 DFS集合全排列+LCM和GCD.但事实上,有更简单的算法,列在 ...
- java nio管道
管道(Pipe) (本部分原文链接,作者:Jakob Jenkov,译者:黄忠,校对:丁一) Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据 ...
- python list去重的方法
转载于:http://yxmhero1989.blog.163.com/blog/static/112157956201381443244790/ Python很简洁 我们喜欢简单有效的代码 一. ...
- 2014-9-17二班----6 web project
部署 加载 到 Tomcat 6.0 服务器上 web.xml <welcome>index.jsp </welcome> <welcome&g ...
- ActiveMQ之消息指针
消息指针(Message cursor)是activeMQ里一个非常重要的核心类,它是提供某种优化消息存储的方法.消息中间件的实现一般都是当消费者准备好消费消息的时候,它会从持久化存储中一批一批的读取 ...
- java--面向接口编程
之前看的一本书的笔记,上周再看设计模式的时候,想到了这篇之前在看某本书时候的笔记. 面向接口编程很重要的一点就是接口回调,用接口声明的变量称作接口变量,属于引用型变量,可以存放实现该接口的类的实例的引 ...
- Vim的tagbar插件
1.tagbar针对当前文件,调用ctags来生成结果,并抓取其结果,像下边这样的 ctags -f - --format=2 --excmd=pattern --extra= --fields=nk ...
- asp.net TreeView与XML配合使用v1.1
刚我在做Tree view 绑定时自己摸索了一下,网上有人说TreeView绑定数据源,用什么递归绑定啥的,我不想看了,就自己试着写了一个 我是这样做的,如果有什么问题请大神指导,我是菜鸟额.. 1: ...
- 在XML里的XSD和DTD以及standalone的使用3----具体使用详解
本人亲自写的一个简单的测试例子 1.xsd定义 <?xml version="1.0" encoding="utf-8"?><xs:schem ...
- Redis安装教程
1. Linux下Redis安装教程 (1)安装 #tar xf redis-2.6.14.tar.gz #cd redis-2.6.14 #make #make install (2)配置 修改re ...