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服务器的命名编码为 ...
随机推荐
- 【Linux高频命令专题(16)】less
概述 less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向 ...
- flexbox弹性盒子布局
混合划分 demo1,css: #demo1{ width: 100%; background: #ccc; display: -webkit-flex;/*表示使用弹性布局*/ } #demo1 . ...
- 从一点儿不会开始——Unity3D游戏开发学习(一)
一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...
- OpenCV源码阅读(2)---matx.h---函数的内联实现
外部矩阵计算函数 namespace internal { template<typename _Tp, int m> struct Matx_DetOp { double operato ...
- shell编程基础(3)条件判断语句
1,带参数的shellscript #this is program build 5.11 to test shell script ############ cxz ####### 5.11 ### ...
- javascript grunt安装和使用
grunt是javascript世界的构建工具. 为何要用构建工具? 一句话:自动化.对于需要反复重复的任务,例如压缩(minification).编译.单元测试.linting等.自动化工具可以减轻 ...
- .net通过获取客户端IP地址反查出用户的计算机名
这个功能看似很少用到,但又非常实用,看似简单,但又在其中存在很多未知因素造成让人悲痛莫名的负能量... 这是公司内部最近在使用的功能,因为是DHCP,所以有时会根据计算机名做一些统计和权限的设置. 也 ...
- Java中boolean型变量的默认值问题
1.首先分析Java中的三种不同变量的区别,如下表所示 概念 默认值 其他 类变量 也叫静态变量,是类中独立于方法之外的变量 用static 修饰 有默认初始值,系统自动初始化. 如boolean ...
- Linux系统下统计目录及其子目录文件个数
(1)查看某目录下文件的个数: ls -l |grep "^-"|wc -l 或 find ./company -type f | wc -l (2)查看某目录下文件的个数,包括子 ...
- trackr: An AngularJS app with a Java 8 backend – Part I
该系列文章来自techdev 我想分享在techdev公司开发的项目-trackr-的一些最新的见解.trackr是一个用来跟踪我们的工作时间,创建报告和管理请假的web应用程序.做这个程序的目的有两 ...