1、UTF-8 and Unicode FAQ
这篇文章说明了在 POSIX 系统 (Linux,Unix) 上使用 Unicode/UTF-8 所需要的信息. 在将来不远的几年里, Unicode 已经很接近于取代 ASCII 与 Latin-1 编码的位置了. 它不仅允许你处理处理事实上存在于地球上的任何语言文字, 而且提供了一个全面的数学与技术符号集, 因此可以简化科学信息交换. UTF-8 编码提供了一种简便而向后兼容的方法, 使得那种完全围绕 ASCII 设计的操作系统, 比如 Unix, 也可以使用 Unicode. UTF-8 就是 Unix, Linux 已经类似的系统使用 Unicode 的方式. 现在是你了解它的时候了 2、GBK编码 中文字符编码简介 GB2312/GBK/GB18030/BIG5 3、杂文 1) 网页编码utf8与gb2312的区别 2) UTF-8 , GBK , GB2312 编码规则与检测 3) 常用字符集编码详解:ASCII 、GB2312、GBK、GB18030、unicode、UTF-8 4、网页form提交(stone同学的文章) http://www.blogjava.net/emu/articles/31756.html 5、Linux Unicode 编程 如何在linux程序中加入并使用 Unicode 以实现外语支持 6、UTF-8与GB2312之间的互换(windows) 相信一定有不少的程序开发人员时常会遇到字符编码的问题,而这个问题也是非常让人头痛的。因为这些都是潜在的错误,要找出这些错误也得要有这方面的开发经验才行。特别是在处理xml文档时,该问题的出现就更加的频繁了,有一次用java写服务器端程序,用vc写客户端与之交互。交互的协议都是用xml写的。结果在通讯时老是发现数据接受不正确。纳闷!于是用抓取网络数据包工具抓取数据,后来才发现原来是java上xml的头是这样的<?xml version="1.0" encoding="UTF-8"?>,而vc上默认的是GB2312。所以一遇到汉字数据就不正确了。去网上找资料,这方面的文章好象特别少,针对像这样的问题,下面我介绍一下我自己写的一个转换程序。当然,程序很简单。如果有画蛇添足的地方,还望各位高手一笑了之。 7、convert gb2312 to utf-8(linux命令行) 一直想把自己的 Linux box 从 zh_CN.GB2312 的 locale 设置迁移到 zh_CN.UTF-8 上 去,无奈之前的大量的实验中用到的文件都是 GB2312 编码的,所以,这个迁移直到最 近因为要在一个工具上添加 UTF-8 编码的中文支持才得以完成。以下是我在这个迁移的 过程碰到的一些和中文相关的问题以及我个人的解决方法,列此一来备忘,二来希望能 给有相同需求的朋友做个参考。 提醒:以下提及的工具中的大部分会对你的原始文件进行”写”操作,也就是说, 转换出 来的结果可能会产生错误或者偏差。如果你不是一个有经验的 Linux 用户,请在做这些 操作的时候,注意先做好备份。并强烈建议你在使用某一个工具之 前,先仔细阅读该工 具的 manual。(”man program-name”) 8、用PHP转换编码 — 将 UTF-8 转换为 GB2312 在处理PHP程序时,常常会遇到编码的问题.特别是处理RSS或者一些XML文件. 一般这些文件的编码都是UTF-8的,但是很多网站要求的编码是GB2312的. 要使UTF-8的文件正常显示 , 这个问题常常使人很头疼. php-mbstring 模块的 mb_convert_encoding() 函数提供了转换character encoding 的功能,但是并不提供 转换成GB2312编码的功能. 不过下面的函数提供了这个功能 9、《Windows核心编程》第二章---window下的Unicode编程 随着M i c r o s o f t公司的Wi n d o w s操作系统在全世界日益广泛的流行,对于软件开发人员来说, 将目标瞄准国际上的各个不同市场,已经成为一个越来越重要的问题。美国的软件版本比国际 版本提前6个月推向市场,这曾经是个司空见惯的现象。但是,由于各国对Wi n d o w s操作系统 提供了越来越多的支持,因此就更加容易为国际市场生产各种应用软件,从而缩短了软件的美 国版本与国际版本推出的时间间隔。 Wi n d o w s操作系统始终不逾地提供各种支持,以帮助软件开发人员进行应用程序的本地化 工作。应用软件可以从各种不同的函数中获得特定国家的信息,并可观察控制面板的设置,以 确定用户的首选项。Wi n d o w s甚至支持不同的字体,以适应应用的需要。 之所以将这一章放在本书的开头,是因为考虑到U n i c o d e是开发任何应用程序时要采用的 基本步骤。本书的每一章中几乎都要讲到关于U n i c o d e的问题,而且书中给出的所有示例应用 程序都是“用U n i c o d e实现的”。如果你为Microsoft Windows 2000或Microsoft Windows CE开发 应用程序,你应该使用U n i c o d e进行开发。如果你为Microsoft Windows 98开发应用程序,你必 须对某些问题作出决定。本章也要讲述Windows 98的有关问题。 10、linux下 c编程 在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。 一、利用iconv函数族进行编码转换 iconv函数族的头文件是iconv.h,使用前需包含之。 #include <iconv.h> iconv函数族有三个函数,原型如下: (1) iconv_t iconv_open(const char *tocode, const char *fromcode); 此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。 (2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft); 此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。 (3) int iconv_close(iconv_t cd); 此函数用于关闭转换句柄,释放资源。 例子1: 用C语言实现的转换示例程序 /* f.c : 代码转换示例C程序 */ #include <iconv.h> #define OUTLEN 255 main() { char *in_utf8 = "姝e?ㄥ??瑁?"; char *in_gb2312 = "正在安装"; char out[OUTLEN]; //unicode码转为gb2312码 rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN); printf("unicode-->gb2312 out=%sn",out); //gb2312码转为unicode码 rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN); printf("gb2312-->unicode out=%sn",out); } //代码转换:从一种编码转为另一种编码 int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen) { iconv_t cd; int rc; char **pin = &inbuf; char **pout = &outbuf; cd = iconv_open(to_charset,from_charset); if (cd==0) return -1; memset(outbuf,0,outlen); if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1; iconv_close(cd); return 0; } //UNICODE码转为GB2312码 int u2g(char *inbuf,int inlen,char *outbuf,int outlen) { return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen); } //GB2312码转为UNICODE码 int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen) { return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen); } 例子2: 用C++语言实现的转换示例程序 /* f.cpp : 代码转换示例C++程序 */ #include <iconv.h> #include <iostream> #define OUTLEN 255 using namespace std; // 代码转换操作类 class CodeConverter { private: iconv_t cd; public: // 构造 CodeConverter(const char *from_charset,const char *to_charset) { cd = iconv_open(to_charset,from_charset); } // 析构 ~CodeConverter() { iconv_close(cd); } // 转换输出 int convert(char *inbuf,int inlen,char *outbuf,int outlen) { char **pin = &inbuf; char **pout = &outbuf; memset(outbuf,0,outlen); return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen); } }; int main(int argc, char **argv) { char *in_utf8 = "姝e?ㄥ??瑁?"; char *in_gb2312 = "正在安装"; char out[OUTLEN]; // utf-8-->gb2312 CodeConverter cc = CodeConverter("utf-8","gb2312"); cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN); cout << "utf-8-->gb2312 in=" << in_utf8 << ",out=" << out << endl; // gb2312-->utf-8 CodeConverter cc2 = CodeConverter("gb2312","utf-8"); cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN); cout << "gb2312-->utf-8 in=" << in_gb2312 << ",out=" << out << endl; } |