在编程当中经常出现乱码的问题,而由此一般会引发很多惨剧,如读文件不成功、用户名显示乱码等,所以端午节抽了一小点时间好好看了一下编码问题,以备遗忘。

首先是中文编码,除了台湾和香港常用的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编码问题小结的更多相关文章

  1. 利用zxing制作彩色,高容错,支持中文等UTF编码的QR二维码图片

    利用zxing制作彩色,高容错,支持中文等UTF编码的QR二维码图片.代码如下 import java.awt.Color;import java.io.File;import java.util.H ...

  2. UTF编码检测

    最近工作上正好需要进行UTF编码检测,自己写了一个,分享给大家,希望可以帮得上有需要用的朋友 public bool isUtf8(byte[] rawText) { bool result = tr ...

  3. Java中文&编码问题小结

    转自:http://www.blogjava.net/zhugf000/archive/2005/10/09/15068.html Java字符编码转换过程说明 常见问题 JVM JVM启动后,JVM ...

  4. python --- 字符编码学习小结(二)

    距离上一篇的python --- 字符编码学习小结(一)已经过去2年了,2年的时间里,确实也遇到了各种各样的字符编码问题,也能解决,但是每次都是把所有的方法都试一遍,然后终于正常.这种方法显然是不科学 ...

  5. UNICODE UTF编码方式解析

    先明确几个概念 基础概念部分 1.字符编码方式CEF(Character Encoding Form) 对符号进行编码,便于处理与显示 常用的编码方式有 GB2312(汉字国标码 2字节) ASCII ...

  6. Delphi7中Unicode,ANSI,UTF编码问题

    注解: ANSI     'American Standard Code for Information Interchange' 美国信息互换标准代码 ANSI的'Ascii'编码 Unicode ...

  7. Python编码问题小结

    开门见山 decode的作用是将其他编码的字符串转换成Unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成Unicode编码. encode的 ...

  8. python --- 字符编码学习小结

    上半年的KPI,是用python做一个测试桩系统,现在系统框架基本也差不多定下来了.里面有用到新学的工厂设计模式以及以及常用的大牛写框架的业务逻辑和python小技巧.发现之前自己写的代码还是面向过程 ...

  9. Java FTP下载文件以及编码问题小结

    问题 之前在开发过程中,遇到了一点问题,我要访问一个FTP服务器去下载文件详细情况如下: 1. 需要传入一个可能为中文的文件名: 2. 通过文件名去FTP上寻找该文件: 3. FTP服务器的命名编码为 ...

随机推荐

  1. lintcode 中等题 :Maximum Product Subarray 最大连续乘积子序列

    题目 乘积最大子序列 找出一个序列中乘积最大的连续子序列(至少包含一个数). 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6. 解题  法一:直接暴力求解 时 ...

  2. 欧拉工程第64题:Odd period square roots

    题目链接 找循环位数是奇数的数有多少个 这个自己很难写出来,完全不能暴力 维基百科链接 维基百科上面说的很好,上面的算法实现就好了. 就是上面的 Java程序: package project61; ...

  3. lintcode :最小路径和

    题目: 最小路径和 给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径. 样例   注意 你在同一时间只能向下或者向右移动一步 解题: 这个和求三角形的最小路径的差不多 ...

  4. Compare_Connect_Letter

    题目描述: 比较两个数字mn和nm(如果mn<nm则m<n, 如果nm<mn则n<m,否则n=m) 连接这两个数字 如(mnnm) //比较两个数字mn和nm(如果mn< ...

  5. Go推出的主要目的之一就是G内部大东西太多了,系统级开发巨型项目非常痛苦,Go定位取代C++,Go以简单取胜(KISS)

    以前为了做compiler,研读+实现了几乎所有种类的语言.现在看语法手册几乎很快就可以理解整个语言的内容.后来我对比了一下go和rust,发现go的类型系统简直就是拼凑的.这会导致跟C语言一样,需要 ...

  6. 使用List,Dictionary加载数据库中的数据

    情景描述:数据库中有一张设备表,字段DWDM存放的是各个厂编号,字段ZNBH存放的是设备编号.其中DWDM跟ZNBH是一对多的关系.需要将数据库中的值加载到List<Dictionary< ...

  7. *两个关键字static和final

    static关键字:可以用于修饰属性,也可以用于修饰方法,还可以用于修饰类. static 修饰属性: 无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量:一个对象对该静态成员变量 ...

  8. JAVA+ Proxool+ SQLserver 2008 “signer information does not match signer information of other classes in the same package”

    1. Proxool+SQLserver2008(sqljdbc4.jar)集成问题最近在项目中遇到个问题:我用的是Proxool连接池,连接SQLserver2008数据库,控制台报错:签名信息和同 ...

  9. ossec 常用命令及目录说明

    1. /var/www/html/analogi -> ossec 第三方的web界面的安装目录 [root@ossec-server ~]# cd /var/www/html/analogi/ ...

  10. java对称加密报错:Input length must be multiple of 8 when decrypting with padded cipher

    HTTP Status 500 - Request processing failed; nested exception is javax.crypto.IllegalBlockSizeExcept ...