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;
}