青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

醬壇子

專注C++技術 在這里寫下自己的學習心得 感悟 和大家討論 共同進步(歡迎批評?。。。?/p>

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

公告

王一偉 湖南商學院畢業 電子信息工程專業

常用鏈接

留言簿(19)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 389619
  • 排名 - 64

最新隨筆

最新評論

閱讀排行榜

評論排行榜

UNICODE
作者:NorthTibet


簡介

????如果你編寫的程序是針對非英語國家的用戶,如中國、日本、東歐和中東地區,那么你一定要熟悉 UNICODE 字符集。尤其是用 Visual C++/MFC 編寫針對上述國家和地區的用戶的程序時,如果你想讓自己的應用程序得到更廣泛的用戶,那么必須考慮代碼 UNICODE 的兼容性,也就是說它既在 ASCII 模式下運行 ,也能在UNICODE 模式下運行。本文將介紹 UNICODE 的一些基本編程知識,澄清很多人(包括我自己)在這個問題上存在的模糊認識。對于任何使用 Visual C++ 和/或 MFC 編程的人來說,這篇文章肯定值得一讀。

UNICODE到底是什么?

????UNICODE 是目前用來解決 ASCII 碼 256 個字符限制問題的一種比較流行的解決方案。大家知道,ASCII 字符集只有256個字符,用 0-255 之間的數字來表示。包括大小寫字母、數字以及少數特殊字符;如標點符號、貨幣符號等。對于大多數拉丁語言來說,這些字符已經夠用。但是,許多亞洲和東方語言所用的字符遠遠不止256個字符。有些超過千個。人們為了突破 ASCII 碼字符數的限制,試圖用一種簡單的方法來針對超過256個字符的語言編寫計算機程序。于是 UNICODE 應運而生。UNICODE 通過用雙字節來表示一個字符,從而在更大范圍內將數字代碼映射到多種語言的字符集。

Visual C++的解決方案

??? 作為軟件開發人員,如何熟練有效地使用 UNICODE 呢?如果你正在用 Visual C++ 編寫程序,UNICODE 兼容性意味著你的程序是否具有國際化特征,也就是說你的應用程序是針對本地市場還是國際市場。一旦你作出了決定,那么就得在代碼中實現具體細節。好在 Visual C++ 提供了很多內建功能來支持 UNICODE,在創建工程時就可以利用 Visual C++ 提供的這些功能。在產生應用程序框架代碼之前,AppWizard 允許開發人員決定是否支持 UNICODE。Win32 SDK 包含有一些數據類型遵循 UNICODE 編碼規則,MFC 以宏的形式提供了將一般文本轉換成 UNICODE 數據類型的途徑。開發人員只需要稍微改變一下編寫代碼的習慣便可以輕松編寫支持 UNICODE 的應用。

字符串

??? C 程序員一般是用 char 關鍵字象下面這樣來聲明一個字符串數組:
       char str[100];       
象下面這樣聲明函數原形:
       void strcpy( char *out, char *in );        


為了將上面的聲明改成支持雙字節的 UNICODE 字符集,可以用下面的方法:

       wchar_t str[100];        
或者
       void wcscpy( wchar_t *out, wchar_t *in );        

??? 此外,微軟還提供一種通過預處理指令來實現 UNICODE。每當用 Visual C++ 創建新工程時,只要確定是否支持另外一種字符集,則 AppWizard 將會在頭文件中插入預處理指令。這些指令告訴編譯器程序想要支持何種字符集。這樣在使用VC++提供的通用數據類型時,編譯器將用相應的數據類型把通用數據類型替換成所需要支持的字符集。這樣很容易將代碼重新編譯成支持其它字符集的程序。
??? 為了在 Visual C++ 6.0 中激活 UNICODE 標準,可以這樣做:打開工程文件后,從主菜單中選擇“Project | Settings”打開工程設置對話框 => 然后選擇“C/C++”標簽 => 在“Preprocessor definitions”編輯框中添加 UNICODE 或者 _UNICODE 預處理宏指令。如圖一所示:


圖一 Project Settings 對話框

注意這里的 UNICODE 和 _UNICODE 有什么區別呢?前者沒有下劃線,專門用于 Windows 頭文件;后者有一個前綴下劃線,專門用于 C 運行時頭文件。
在代碼中,凡是用關鍵字 char ?的地方都用 TCHAR 取代;凡是用 char * 的地方都用 LPTSTR 取代;凡是定義在雙引號中的字符串常量(如"VCKBASE Online Journal")都用 TEXT 宏重寫:

       TEXT("VCKBASE Online Journal");       
TEXT 宏的主要作用是當定義了 UNICODE/_UNICODE 預處理指令時,字符串被標志為雙字節字符串,否則字符串被標示為 ANSI 字符串。TEXT 的定義如下:
      TEXT(
           LPTSTR string // ANSI 或者 Unicode 字符串
      );
      參數   string 為字符串指針,指向被解釋的 Unicode 或者 ANSI 字符串
在文檔中 微軟提供了包括通用類型在內的幾種數據類型都與 ASCII 和 UNICODE兼容。這一點可以參考微軟在線文檔有關“通用數據類型和數據類型”的章節。

例子代碼

下面通過一些簡單的例子來進一步探討 UNICODE 編程。

使用 ASCII 字符集的“Hello, World”:

//*********************************
// 用 MFC 實現的"Hello World!" 代碼
//*********************************

//hello.cpp

#include <afxwin.h>

// Declare the application class
class CHelloApp : public CWinApp
{
public:
   virtual BOOL InitInstance();
};

// Create an instance of the application class
CHelloApp HelloApp;
 
// Declare the main window class
class CHelloWindow : public CFrameWnd
{
   CStatic* cs;
public:
   CHelloWindow();
};

// The InitInstance function is called each
// time the application first executes.
BOOL CHelloApp::InitInstance()
{
   m_pMainWnd = new CHelloWindow();
   m_pMainWnd->ShowWindow(m_nCmdShow);
   m_pMainWnd->UpdateWindow();
   return TRUE;
}

// The constructor for the window class
CHelloWindow::CHelloWindow()
{
   // Create the window itself
   Create(NULL, "Hello World!", WS_OVERLAPPEDWINDOW, 
          CRect(0,0,200,200)); 
	
   // Create a static label
   cs = new CStatic();
   cs->Create("hello world", WS_CHILD|WS_VISIBLE|SS_CENTER, 
              CRect(50,80,150,150), this);
}

修改上面的代碼使之支持 UNICODE 字符集,串常量必須要改成對應的 UNICODE 字符。方法是對串常量使用TEXT 宏。這個宏將告訴預處理器檢查使用什么樣的字符標準:

// The constructor for the window class
CHelloWindow::CHelloWindow()
{
   // Create the window itself
   Create(NULL, TEXT("Hello World!"), WS_OVERLAPPEDWINDOW, 
          CRect(0,0,200,200));
	
   // Create a static label
   cs = new CStatic();
   cs->Create( TEXT("hello world!"), WS_CHILD|WS_VISIBLE|SS_CENTER, 
              CRect(50,80,150,150), this);
}

當預處理器碰到通用數據類型,它便檢查 AFXWIN.H 頭文件的 _UNICODE 定義。然后根據 UNICODE 定義插入相應的的數據類型。

下面的這個例子使用 Win32 API 函數和通用數據類型設置 C 盤的卷標。

//******************
// 設置 C 盤的卷標
//******************

// drvsvl.cpp

#include <windows.h>
#include <iostream.h>

void main()
{
   BOOL success;
   char volumeName[MAX_PATH];

   cout << "輸入新的 C 盤卷標:";
   cin >> volumeName;

   success = SetVolumeLabel("c:\\", volumeName);
   if (success)
      cout << "成功\n";
   else
      cout << "錯誤代碼:" << GetLastError() << endl;
}

通過使用 TCHAR 數據類型,將這段代碼最上面的字符數組聲明為兩個字節的字符。TEXT 宏再次被用于字符串常量:

void main()
{
   BOOL success;
	
   TCHAR volumeName[MAX_PATH];

   cout << TEXT("輸入新的 C 盤卷標: ");
   cin >> volumeName;

   success = SetVolumeLabel(TEXT("c:\\" ), volumeName);
   if (success)
      cout << TEXT("成功\n");
   else
      cout << TEXT("錯誤代碼:") << GetLastError() << endl;
} 
Visual C++ 中的通用數據類型

??? Visual C++ 提供了幾種 MFC 專用的數據類型用于創建具有國際化特性的應用程序。這些定義很通用,完全可以在 UNICODE、ASCII、DBCS (雙字節字符集) 和 MBCS (多字節字符集)。由于篇幅所限,本文不打算涉及所有上面提到的這些字符集。有關它們的詳細資料請參考相關資料。MFC 提供了一種透明的方式來實現這些字符集。通用數據類型的映射到哪個字符集以及映射方式是根據工程的設置決定的,默認值為 ASCII 模式,其它幾個可選項是 MBCS、DBCS 或者 UNICODE。本文主要討論 UNICODE,所以下表中只列出了 ASCII 與 UNICODE 字符之間的映射關系:

表一:

通用 MFC 數據類型
映射到 ASCII
映射到 UNICODE
注釋
_TCHAR
char
wchar_t
_TCHAR 是一個映射宏,當定義 UNICODE 時,該數據類型映射到 wchar_t,如果沒有定義 UNICODE,那么它映射到 char。
_T 或 _TEXT
char 常量字符串
wchar_t 常量字符串
功能與宏相同,在 ASCII 模式下,它們被忽略,也就是說被預處理器刪除掉,但是如果定義了UNICODE, 則它們會將常量字符串轉換成等價的 UNICODE 。
LPTSTR
char*, LPSTR(Win32)
wchar_t*
可移植的32位字符串指針。它將字符類型映射到工程設置的類型。
LPCTSTR
const char*, LPCSTR(Win32)
const wchar_t*
可移植的32位常量字符串指針。它將字符類型常量映射到工程設置的類型。

使用表一中列出的通用數據類型,開發人員可以保證所創建的工程始終是針對一種字符集,這些通用數據類型就相當于占位符,在編譯時被特定的字節所替代,使得應用程序在 ASCII 和 UNICODE 模式下都能運行。但是,有一點要特別注意,那就是上述的通用數據類型為微軟專有,與 ANSI 標準并不兼容。有關微軟提供的這些通用數據類型詳細描述請參考 MSDN 庫文檔。

有關技術注釋

??? 為了成功編譯支持 UNICODE 的 MFC 程序,必須使用 MFC 的 UNICODE 版本庫。該庫在定制安裝Visual C++ 時是個可選安裝項。
??? 有一點很重要:那就是不使用 UNICODE 標準在外觀上并不影響程序的執行。也就是說,上面提到過的代碼不管設沒設置 _UNICODE 生成選項,最終都能生成正常運行的程序。當開發人員使用多個版本的Win32 API函數時才會出現問題。
??? 在使用多個版本的 Win32 API函數(任何有字符或字符串作為參數的 Win32 API函數)時,編譯器根據是否設置 _UNICODE 指令來決定調用正確的函數。如果沒有定義_UNICODE,那么編譯器將默認調用 ASCII 版本函數。

結束語

??? 綜上所述可以看到,編譯 UNICODE 版本的程序并不難。只是在編寫代碼時記住函數調用上些微的變化。微軟為此提供的擴展是開發人員能夠以透明的方式選擇所用的字符集,為應用軟件的國際化打開了方便之門。
??? Jeffrey Richter 在他的《Windows 核心編程》(機械工業出版社-王建華、張煥生、侯麗坤等譯)一書中專門用一章討論了 UNICODE。翻譯得也不錯。有興趣的朋友不妨找來看看。

posted on 2007-01-05 13:18 @王一偉 閱讀(4173) 評論(4)  編輯 收藏 引用

Feedback

# re: UNICODE 介紹 2007-01-09 13:33 eXile
這兩行是錯誤的:
 cout << TEXT("輸入新的 C 盤卷標: ");
cin >> volumeName;
cin, cout并不能處理UNICODE,按照Microsoft的風格,可能也要定義一個tin, tout...

要支持UNICODE,各式各樣的字符串處理才是困難的地方。
  回復  更多評論
  

# re: UNICODE 介紹 2007-11-28 23:07 82860801
看完之后有點明白了大體意思!  回復  更多評論
  

# re: UNICODE 介紹 2007-12-29 16:32 Solomon Joh
可以講講UNIX/LINUX下的unicode編程知識嗎?  回復  更多評論
  

# re: UNICODE 介紹 2007-12-30 08:06 @王一偉
沒有涉及過unix/linux編程哦 可以探討下 過陣我會研究一下linux下的,d等我有兩臺電腦的時候 呵呵
  回復  更多評論
  


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美午夜精品久久久久免费视 | 激情久久综艺| 国产精品日韩精品欧美精品| 国产精品mm| 国产日韩一区在线| 国内精品一区二区| 亚洲三级视频| 亚洲天堂av在线免费| 欧美一级大片在线免费观看| 久久久综合免费视频| 亚洲国产精品久久久久| 欧美激情按摩在线| 一本色道久久综合亚洲91| 国产精品一区二区久激情瑜伽| 久久超碰97人人做人人爱| 美女日韩在线中文字幕| 日韩一级片网址| 久久精品欧美日韩精品| 欧美日韩成人| 伊人婷婷欧美激情| 亚洲——在线| 亚洲大片在线观看| 午夜一级久久| 欧美日韩亚洲高清一区二区| 国内一区二区三区| 亚洲一区中文字幕在线观看| 欧美不卡高清| 午夜一区二区三区在线观看| 每日更新成人在线视频| 国产精品午夜在线观看| 日韩网站免费观看| 免费在线观看精品| 亚洲欧美日产图| 欧美日韩免费在线观看| 亚洲成人在线免费| 久久久久免费观看| 亚洲少妇最新在线视频| 欧美国产日本| 亚洲国产另类精品专区| 亚洲视频播放| 免费在线亚洲欧美| 亚洲综合丁香| 欧美午夜不卡在线观看免费 | 亚洲欧美日韩精品在线| 精品电影在线观看| 亚洲自拍电影| 亚洲欧洲日产国产网站| 久久野战av| 在线观看欧美亚洲| 裸体歌舞表演一区二区| 香蕉久久夜色| 国产性天天综合网| 久久国产欧美精品| 午夜精品久久| 国产一区二区黄色| 久久香蕉国产线看观看网| 久久av老司机精品网站导航| 国产真实乱偷精品视频免| 久久精品国产96久久久香蕉| 亚洲一区二区在线视频| 国产精品视频精品| 午夜精品成人在线视频| 亚洲免费在线精品一区| 国产亚洲精品成人av久久ww| 久久嫩草精品久久久精品一| 久久久夜夜夜| 老司机午夜免费精品视频| 一区二区三区精品视频在线观看| 亚洲激情在线| 欧美日韩中文另类| 欧美一区二粉嫩精品国产一线天| 性视频1819p久久| 韩国一区二区在线观看| 欧美激情视频在线播放| 欧美色精品天天在线观看视频 | 国产精品成av人在线视午夜片| 亚洲一区二区在线播放| 亚洲一二三级电影| 国产专区综合网| 欧美激情亚洲精品| 国产精品爱久久久久久久| 久久人人爽爽爽人久久久| 欧美大色视频| 欧美一区二区三区免费视| 久久久亚洲综合| 亚洲午夜在线观看| 久久久久久电影| 亚洲亚洲精品在线观看 | 麻豆成人精品| 亚洲一二三区在线观看| 久久不射中文字幕| av成人动漫| 久久精品国产999大香线蕉| 亚洲精品视频在线播放| 久久精品亚洲国产奇米99| 欧美色另类天堂2015| 久久久久久久久一区二区| 欧美激情1区2区3区| 欧美在线视频播放| 欧美绝品在线观看成人午夜影视| 欧美一乱一性一交一视频| 欧美不卡在线| 久久一日本道色综合久久| 亚洲在线成人精品| 激情综合久久| 亚洲深夜福利网站| 亚洲激情视频在线| 亚洲制服丝袜在线| 亚洲精品久久久久久久久久久久久| 亚洲婷婷综合久久一本伊一区| 伊人成人在线视频| 午夜在线观看免费一区| 夜夜嗨av一区二区三区网站四季av | 亚洲婷婷综合色高清在线 | 国产婷婷色一区二区三区在线| 亚洲人成网站777色婷婷| 国内外成人免费激情在线视频网站 | 国语精品中文字幕| 亚洲美女诱惑| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲国产精品一区在线观看不卡| 亚洲一区二区黄色| 一本综合久久| 欧美 日韩 国产在线| 久久久91精品国产一区二区三区| 欧美午夜视频在线| 一区二区国产在线观看| 一本色道久久综合亚洲精品高清| 欧美va天堂在线| 亚洲国产二区| 亚洲毛片一区二区| 欧美国产成人在线| 亚洲欧洲一区二区在线观看| 亚洲精品一区二区在线观看| 免费美女久久99| 亚洲国产精品毛片| 日韩写真视频在线观看| 欧美激情区在线播放| 亚洲精品国产精品久久清纯直播| 在线一区二区视频| 久久久久久一区二区三区| 久久综合一区二区三区| 在线日韩中文字幕| 欧美大片在线观看一区二区| 亚洲日韩欧美视频| 一区二区三区国产精华| 国产精品久久精品日日| 欧美亚洲三区| 欧美大片91| 在线亚洲一区| 国产日韩亚洲欧美综合| 久久亚洲欧美| 日韩视频免费大全中文字幕| 亚洲欧美日韩精品久久奇米色影视| 99精品热视频| 欧美一区二区三区在线看 | 看片网站欧美日韩| 亚洲经典自拍| 午夜精品久久久久| 国产一区二区三区在线观看精品| 久久视频在线视频| 一本到高清视频免费精品| 欧美在线视频日韩| 亚洲国产精品小视频| 欧美特黄一级大片| 久久国产精品99精品国产| 亚洲国产精品综合| 欧美在线观看视频一区二区| 狠狠入ady亚洲精品经典电影| 欧美激情一区二区三区在线视频观看 | 中文在线资源观看网站视频免费不卡| 久久中文字幕一区| 一区二区三区四区在线| 久久久久久久久久久久久9999| 日韩视频精品在线| 国产一区视频在线看| 欧美日韩高清在线观看| 久久成人国产精品| 日韩天天综合| 欧美黄色aa电影| 久久精品国产亚洲一区二区三区| 亚洲美女黄色片| 伊人久久成人| 国产精品日韩在线观看| 欧美区日韩区| 快射av在线播放一区| 亚洲在线播放电影| 日韩视频在线你懂得| 欧美成人免费在线观看| 欧美专区第一页| 亚洲一区二区av电影| 亚洲日本激情| 亚洲电影下载| 一区二区视频免费在线观看| 国产精品在线看| 欧美午夜电影网| 欧美美女日韩| 欧美国产亚洲另类动漫| 蜜臀av一级做a爰片久久| 久久视频精品在线|