日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC----实现汉字简繁转换

發布時間:2023/12/20 c/c++ 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC----实现汉字简繁转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請注明出處:http://blog.csdn.net/yf210yf/article/details/7850472

繁體為什么分為亂碼和非亂碼的。現在總算搞清楚了
看起來是亂碼那種叫Big5,非亂碼的叫GBK繁體
GBK包括了簡體和繁體
亂碼的是Big5

GB2312字集是簡體字集,全稱為GB2312(80)字集,共包括國標簡體漢字6763個。?
BIG5字集是臺灣繁體字集,共包括國標繁體漢字13053個。?
GBK字集是簡繁字集,包括了GB字集、BIG5字集和一些符號,共包括21003個字符。

一般來說,如果您在簡體中文操作系統中使用繁體字,選GBK碼繁體中文;如果您在繁體中文操
作系統中使用繁體字,選Big5碼繁體中文。


不知道會不會寫的很多,總之先補一下知識:

(1)計算機漢字編碼簡介

關于漢字編碼

  為進行信息交換,各漢字使用地區都制訂了一系列漢字字符集標準。

①?GB2313字符集,收入漢字6763個,符號715個,總計7478個字符,這是大陸普遍使用的簡體字符集??w-GB2313、仿宋-GB2313、華文行楷等市面上絕大多數字體持顯示這個字符集,亦是大多數輸入法所采用的字符集。市面上絕大多數所謂的繁體字體,其實采用的是GB-2313字符集簡體字的編碼,用字體顯示為繁體字,而不是直GBK字符集中繁體字的編碼,錯誤百出。

  ②?BIG-5字符集,收入13060個繁體漢字,808個符號,總計13868個字符,目前普遍使用于臺灣、香港等地區。臺灣教育部標準宋體楷體等港臺大多數字體支持這個字符集的顯示。

  ③?GBK字符集,又稱大字符集(GB=GuóBiāo國標,K=擴展),包含以上兩種字符集漢字,收21003個漢字,882個符號,共計21885個字符,包括了中日韓(CJK)統一漢20902個、擴展A(CJK?Ext-A)?中的漢字52個。Windows?95\98簡體中文版就帶有這個GBK.txt文件。宋體、隸書、黑體、幼圓、華文中宋、華文細黑、華文楷體、標楷(DFKai-SB)Arial?Unicode?MSMingLiU、PMingLiU等字體支持顯示這個字符集。微軟拼音輸入法2003、全拼、紫光拼音等輸入法,能夠錄入如镕镕炁夬喆嚞姤赟赟龑昳堃慜靕臹等GBK簡繁體漢字。


  BIG-5?(繁體中文)GB-2313?(簡體中文),編碼不相兼容,字符在不同的操作系統中便產生亂碼。文本文字的簡體與繁體(文字及編碼)之間的轉換,可用BabelPad
、TextProConvertz之類的轉碼軟件來解決。若是程序,Windows?XP操作系統,可用Microsoft?AppLocale?Utility?1.0解決;Windows?2000的操作系統,大概只有用:中文之星、四通利方、南極星、金山快譯之類的轉碼軟件方能解決了。

  ④?GB18030字符集,包含GBK字符集、CJK?Ext-A?全部6582個漢字,共計27533個漢字。宋體-18030、方正楷體(FZKai-Z03)、書同文楷體(MS?Song)宋體(ht_cjk+)、香港華康標準宋(DFSongStd)、華康香港標準楷體、CERG?Chinese?Font、韓國New?Gulim,以及微軟Windows?Vista操作系統提供的宋黑楷仿宋等字體亦支持這個字符集的顯示。Windows?98支持這個字符集,以下的字符集則不支持。手寫輸入法逍遙筆4.0版支持GB18030字符集及方正超大字符集漢字的錄入。


  ⑤?方正超大字符集,包含GB18030字符集、CJK?Ext-B中的36862個漢字,共計64395個漢字。宋體-方正超大字符集支持這個字符集的顯示。Microsoft?Office?XP2003簡體
中文版就自帶有這個字體。Windows?2000的操作系統需安裝超大字符集支持包Surrogate更新。


  ⑥?ISO/IEC?10646?/?Unicode字符集,這是全球可以共享的編碼字符集,兩者相互兼融,涵蓋了世界上主要語文的字符,其中包括簡繁體漢字,計有:CJK統一漢字20902
個,CJK?Ext-A?6582個,Ext-B?42711個,共計70195個漢字。SimSun-ExtB(宋體)、MingLiU-ExtB(細明體)能顯示全部Ext-B漢字。至今尚無單獨一款字體能夠顯示全部70195個漢字,但可用海峰五筆、新概念五筆、倉頡輸入法世紀版、新版的微軟新注音、倉頡輸入法?6.0?(單碼功能)等輸入法錄入。Ext-C還有2萬多個漢字。

  關于Unicode   由于各國國家標準字集所收的漢字字數、常用字的差異,雖然象中國兩岸GB/BIG5字集常用字基本類似,轉換后閱讀并不成問題,但是這種編碼轉換的混亂關系,對文字交流始終是一種障礙。因此相關國家的標準化組織和文字工作者經過共同努力,終于在93年完成了包含中日韓(CJK)漢字的Unicode?漢字標準ISO?10646.1。?Unicode是完全雙字節表示的多國文字編碼體系,編碼空間0x0000-0xFFFF。 ISO?10646.1漢字標準使用編碼0x4E00-9FA5,共包含20902個漢字。其中:?大陸(S)提出的漢字17124個,臺灣(T)提出的漢字17258;?ST的并集,即中國(C)提出的漢字為20158個。?日本(J)提出的漢字為12157個,中國未提出的690(Ja);?韓國(K)提出的漢字為7477個,其中中國未提出的90(Ka);?JaKa并集共744字。?支持Unicode編碼的相關電腦系統軟件,如Unix,?Win95已有推出,但是由于UnicodeASCII碼是用雙字節編碼(即一般電腦系統中的單字節ASCII前加?0x00),同時其漢字編碼與各國的現有編碼也不兼容,造成現有的軟件和數據不能直接使用,所以目前完全使用Unicode軟件系統的用戶并不多,大多數只將它此作為一個

國際語言編碼標準來使用。


(2)基本原理

由上述編碼知識可知,字體的切換其實就是編碼的切換

GB2312<->Unicode<->BIG5

這樣一個流程,Unicode充當切換的橋梁。


(3)VC的實現

先上代碼再解釋:

#include <iostream> #include <atlstr.h> #include <locale.h> using namespace std; char* UnicodeToBIG5(const wchar_t* szUnicodeString); char* UnicodeToGB2312(const wchar_t* szUnicodeString); wchar_t* GB2312ToUnicode(const char* szGBString); char* GB2312ToBIG5(const char* szGBString);void main() { locale loc( "chs" );//定義“區域設置”為中文方式//wchar_t str[]=L"中國";char str[100];cin>>str;char * rlt=GB2312ToBIG5(str);CString cStr1; cStr1.Format( "%s",rlt); setlocale(LC_ALL, ".950");cout<<rlt<<endl; } wchar_t* GB2312ToUnicode(const char* szGBString) {UINT nCodePage = 936; //GB2312int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);wchar_t* pBuffer = new wchar_t[nLength+1];MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);pBuffer[nLength]=0;return pBuffer; } //BIG5 轉換成 Unicode: wchar_t* BIG5ToUnicode(const char* szBIG5String) {UINT nCodePage = 950; //BIG5int nLength=MultiByteToWideChar(nCodePage,0,szBIG5String,-1,NULL,0);wchar_t* pBuffer = new wchar_t[nLength+1];MultiByteToWideChar(nCodePage,0,szBIG5String,-1,pBuffer,nLength);pBuffer[nLength]=0;return pBuffer; } //Unicode 轉換成 GB2312: char* UnicodeToGB2312(const wchar_t* szUnicodeString) {UINT nCodePage = 936; //GB2312int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);char* pBuffer=new char[nLength+1];WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);pBuffer[nLength]=0;return pBuffer; } //Unicode 轉換成 BIG5: char* UnicodeToBIG5(const wchar_t* szUnicodeString) {UINT nCodePage = 950; //BIG5int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);char* pBuffer=new char[nLength+1];WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);pBuffer[nLength]=0;return pBuffer; } //繁體中文BIG5 轉換成 簡體中文 GB2312 char* BIG5ToGB2312(const char* szBIG5String) {LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);wchar_t* szUnicodeBuff = BIG5ToUnicode(szBIG5String);char* szGB2312Buff = UnicodeToGB2312(szUnicodeBuff);int nLength = LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE, (LPCSTR)szGB2312Buff,-1,NULL,0);char* pBuffer = new char[nLength + 1];LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,(LPCSTR)szGB2312Buff,-1,pBuffer,nLength);pBuffer[nLength] = 0;delete[] szUnicodeBuff;delete[] szGB2312Buff;return pBuffer; } //簡體中文 GB2312 轉換成 繁體中文BIG5 char* GB2312ToBIG5(const char* szGBString) {LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);int nLength = LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,NULL,0);char* pBuffer=new char[nLength+1];LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,pBuffer,nLength);pBuffer[nLength]=0;wchar_t* pUnicodeBuff = GB2312ToUnicode(pBuffer);char* pBIG5Buff = UnicodeToBIG5(pUnicodeBuff);delete[] pBuffer;delete[] pUnicodeBuff;return pBIG5Buff; }
運行的效果圖:

輸入:簡體中文

c輸出:繁體中文


轉載請注明出處:http://blog.csdn.net/yf210yf/article/details/7850472

(4)詳解

假如您是高手,請跳過,下面的講解可能對您很基礎。

1>locale loc( "chs" );//定義“區域設置”為中文方式

2>wchar_t定義的是寬字節

所謂的多字節與寬字節,就是指ASCII字符和Unicode字符。前者占一個字節,后者占兩個字節。
Win2000以后的系統從底層支持Unicode字符。就現在來看,盡量要要用Unicode字符,這樣可以提高程序效率,避免系統在內部進行轉換。Win2000以后的系統中,所有API函
數只接受Unicode字符,如果傳入ASCII字符,系統會自動把它轉換成Unicode字符,再調用函數。

例如:

‘中’ ? Unicode碼值:U+4E2D? UTF-8 編碼 e4 b8 ad
‘文’ ? Unicode碼值:U+6587? UTF-8 編碼? e6 96 87

我們需要理解用char[ ]和wchar_t [ ]來存放“中文”時有什么不同

????char????str[]="中文";
????wchar_t?wstr[]?
=?L"中文";????

我們使用gdb這個強大的工具來查看str[]和wst[]中究竟都存放了哪些值(請注意顏色之間的對應關系)

(gdb)?x?/8xb?&str
0xbf83decd:?????0xe4????0xb8????0xad????0xe6????0x96????0x87????0x00????0xf0
(gdb)?x?
/12xb?&wstr
?? 0xbf83dec0:?????0x2d??? 0x4e??? 0x00??? 0x00????0x87??? 0x65??? 0x00??? 0x00
?? 0xbf83dec8:?????0x00??? 0x00??? 0x00??? 0x00

不難看出,char str[ ]中存儲的是“中文"的UTF-8編碼,這是因為我的機器的locale是zh_CN.UTF-8,程序源文件的自然采用的是UTF-8編碼,因此編譯器 在處理 char str[ ]="中文"; 時,t它對str[]所做得初始化實際上可以理解成??? char str[ ]={ 0xe4,0xb8,0xad,0xe6,0x96,0x87,0x00}

而wchar_t wstr[ ]中存放的是“中文"的Unicode碼值,這符合C標準對寬字符的定義。這里需要解釋的是C標準中規定寬字符是16 bit的字符,而從GNU glibc 2.2開始,類型wchar_t只用于存放32-bit的ISO 10646碼值(你可以粗略的把ISO 10646理解成Unicode,盡管它們并不是一回事),而獨立于當前使用的locale;因此在上面的輸出中,我們看到每個Unicode碼值用 32bit表示,而不是16bit。
參考:http://blog.csdn.net/lovekatherine/article/details/1868724

而要正常打印寬字節,需要

setlocale (LC_ALL,""); wchar_t wstr[] = L"中文"; wcout<<wstr<<endl;
注意setlocale (LC_ALL,"");很重要,否則會輸出??

那關于setlocale的介紹如下

setlocale

配置地域化信息。

語法:?? char * setlocale ( int category, const char * locale );

返回值: 字符串

函數種類: 操作系統與環境

內容說明

本函數用來配置地域的信息,設置當前程序使用的本地化信息。參數 category 有下列的選擇:

??? * LC_ALL 包括下面的全項選項都要。
??? * LC_COLLATE 配置字符串比較,PHP 目前尚未實作出來本項。
??? * LC_CTYPE 配置字符類別及轉換。例如全變大寫 strtoupper()。
??? * LC_MONETARY 配置金融貨幣,PHP 目前尚未實作。
??? * LC_NUMERIC 配置小數點后的位數。
??? * LC_TIME 配置時間日期格式,與 strftime() 合用。

而參數 locale 若是空字符串 "",則會使用系統環境變量的 locale 。若 locale 為零(NULL),則不會改變地域化配置,返回當前的地域值,若系統尚未實作則返回 false。

Locales contain information on how to interpret and perform certain input/output and transformation operations taking into consideration location and language specific settings.

Most running environments have certain locale information set according to the user preferences or localization. But, independently of this system locale, on start, all C programs have the "C" locale set, which is a rather neutral locale with minimal locale information that allows the result of programs to be predictable. In order to use the default locale set in the environment, this function can be called with "" as the locale parameter.

The locale set on start is the same as setlocale(LC_ALL,"C") would set.
The entire default locale can be set by calling setlocale(LC_ALL,"");

C程序開始的時候的設置和 setlocale(LC_ALL,"C")相同

使用系統默認的設置調用setlocale(LC_ALL,"");

The parts of the current locale affected by a call to this function are specified by parameter category.
Return Value
On success, A pointer to a C string identifying the locale currently set for the category. If category is LC_ALL and different parts of the locale are set to different values, the string returned gives this information in a format which may vary between compiler implementations.

例子:

/* setlocale example */ #include <stdio.h> #include <time.h> #include <locale.h>int main () {time_t rawtime;struct tm * timeinfo;char buffer [80];struct lconv * lc;time ( &rawtime );timeinfo = localtime ( &rawtime );int twice=0;do {printf ("Locale is: %s/n", setlocale(LC_ALL,NULL) ); //使用NULL參數,獲取當前配置strftime (buffer,80,"%c",timeinfo);printf ("Date is: %s/n",buffer);lc = localeconv ();printf ("Currency symbol is: %s/n-/n",lc->currency_symbol);setlocale (LC_ALL,"");} while (!twice++);return 0; }One of the possible outputs when the previous code is run is:Locale is: C Date is: 01/15/07 13:33:47 Currecy symbol is: - Locale is: English_United States.1252 Date is: 1/15/07 1:33:47 PM Currency symbol is: $
3)

CString ? cStr1;?

cStr1.Format( "%s",rlt);?

用到了CString 和 char *的轉換

CString 轉換成char*: char* ch = cstring.GetBuffer(cstring.GetLength()); char*轉換成CString: CString.Format( "%s ",ch);
4>在這幾個函數中還涉及一個問題

char* UnicodeToBIG5(const wchar_t* szUnicodeString);
char* UnicodeToGB2312(const wchar_t* szUnicodeString);
wchar_t* GB2312ToUnicode(const char* szGBString);
char* GB2312ToBIG5(const char* szGBString);

const char*, char const*, char*const的區別

char * const cp???? : 定義一個指向字符的指針常數,即const指針
const char* p?????? : 定義一個指向字符常數的指針
char const* p?????? : 等同于const char* p

5>MultiByteToWideChar 接口 字面意思可以看出是多字節轉寬字節 //Big5 -> Unicode
//用MultiByteToWideChar來返回字符個數
lngLen = MultiByteToWideChar(950, 0, strSource, -1, NULL, 0) 'MultiByteToWideChar 返回的是字符個數,乘 2 才是所需要分配的空間
lngLen = lngLen - 1 'MultiByteToWideChar 返回的個數多了1

strUnicode = String(lngLen * 2, 0)
lngRet = MultiByteToWideChar(950, 0, strSource, -1, strUnicode, lngLen)

//Unicode -> GB 繁體
lngLen = WideCharToMultiByte(936, 0, strUnicode, -1, NULL, 0, NULL, 0)
//lngLen = Len(strUnicode)
strGBKT = String(lngLen, 0)lngLen = WideCharToMultiByte(936, 0, strUnicode, -1, strGBKT, lngLen, NULL, 0)
思路是先
先用MultiByteToWideChar來返回字符個數
然后轉換成新的字符編碼 轉載請注明出處:http://blog.csdn.net/yf210yf/article/details/7850472


總結

以上是生活随笔為你收集整理的VC----实现汉字简繁转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。