繁简转换纪要
繁簡轉換是老技術,但如果方法不當,還是得花一點時間的,本文盡量闡明其中的陷阱,減少新手的時間。
首先繁簡轉換不等于Big5 to GBK。GBK包含Big5中的所有繁體字,所以你平時看到的繁體不一定就是Big5的。word中的繁簡轉換就只是在GBK編碼中進行。很多繁簡轉換的工具是Big5 to GBK,所以如果你的文本不是Big5編碼的,那么轉換結果肯定是亂碼。在簡體的操作系統上,你把“專案管理導出範本”這幾個字復制到記事本中,這幾個字其實是GBK編碼,如果你想保存在BIG5編碼的文件中,要復制到word中,點擊另存為,將保存類型設為txt,接著word會出現一個對話框讓你選擇編碼,選擇big5即可。了解這一點后下一步就很容易了。
下面我們要把"專案管理導出範本.xls"轉換成簡體:
GBK編碼的繁簡轉換方法(VC)
char *strTemp="專案管理導出範本.xls";
//把區域設置為簡體
WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);
//獲取轉換后的字符串的長度。
//把字符串映射到簡體編碼之上。
int nReturn = LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, strTemp, k, NULL, 0);
char *myStr = new char[nReturn+1];//結果字符串
LCMapString(wLCID,LCMAP_SIMPLIFIED_CHINESE,
?(LPCSTR)strTemp, nReturn,
?(LPSTR)myStr, nReturn+1);
myStr[nReturn] = '/0';
AfxMessageBox(myStr);
如果你使用delphi,代碼就更簡單:
function Big52Gb(Str:string):string;
begin
? SetLength(Result,Length(Str));
? LCMapString(GetUserDefaultLCID,LCMAP_SIMPLIFIED_CHINESE,
??? PChar(Str),Length(Str),
??? PChar(Result),Length(Result));
end;
如果你執著于不使用API,要自己實現,那么首先要把GBK編碼轉換成BIG5編碼,方法是先轉換為Unicode,再轉換為Big5(在此謝謝CSDN上的朋友):
CString Convert(CString str, int sourceCodepage, int targetCodepage)
{
?int len=str.GetLength();
?//先轉成WideChar
?//codepage按照什么來讀取傳入的字符串。
?int unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0);
?wchar_t * pUnicode;
?pUnicode=new wchar_t[unicodeLen+1];
?memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
?MultiByteToWideChar(sourceCodepage,0,str,-1,(LPWSTR)pUnicode,unicodeLen);
?//再轉成二進制流(或者說是字符流,就是最終的字符。)
?BYTE * pTargetData;
?int targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,0,NULL,NULL);
?pTargetData=new BYTE[targetLen+1];
?memset(pTargetData,0,targetLen+1);
?WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,targetLen,NULL,NULL);
?CString rt;
?rt.Format("%s",pTargetData);
?delete pUnicode;
?delete pTargetData;
?return rt;
}
得到Big5編碼的字符串后,你就可以進行Big5 to GB的轉換了,詳細算法描述見 GBK字符集知識(http://www.hacker.com.cn/article/list.asp?id=3697)。網上還有現成的VC、java、python實現源代碼,在此不再贅述。?
總結
- 上一篇: 2021年企业服务行业BP和融资计划书P
- 下一篇: SpringBoot自定义数据源Drui