1. 程式人生 > >中文在C/C++中的處理和漢字亂碼問題(wchar_t)

中文在C/C++中的處理和漢字亂碼問題(wchar_t)

生成 setlocale 錯誤 並且 超過 函數 開發 長度 tracking

中文字在C/C++中的處理

現在編程的語言和編程環境隨著中國的發展開始對中文有進一步的支持。可是對中文的支持整體來說是有缺陷的,並且有與編譯環境的不同導致中文在當前的C/C++中有非常多問題,並且非常多版本號對中文的支持是不全然的。就拿DEV-C++和VS2005為例。對與MSDN的幫助和網上的講述兩者在那些代碼的支持有非常多不同的地方。

而我要討論的就是對於中文在C/C++的應用方法。

首先中文字是在一般char的範圍以外的,所以我們不能用單個char存儲我們的中文字,於是我們大多引進wchar_t這種寬字符的數據類型。可是在我所用過的編譯環境中通常是定義為wchar_t。這是C++語言中認可的定義。他的空間就和unsigned short

的大小一樣,所以有這種內部定義:typedef unsigned short wchar_t。他是16位的。

在DEV-C++中我們有非常多方法是不能用的,對於VS2005,我們能夠定義和應用的非常多方法和和非常多庫函數在DEV-C++都不能夠用的。如在MSDN和非常多網絡資料中提到的輸入和輸出方法像wcin和wout在DEV-C++都是顯示沒有定義的,也就是說DEV-C++是不支持這些方法的。簡單寬字符的輸入和輸出例如以下:

#include<iostream>

using namespace std;

int

main()

{

wchar_t a[3];

wcin >> a;

wcout << a << endl;

return 0;

}

但這樣僅僅能輸入單個漢字字符,假設超過2個中文字就會有溢出的錯誤,而用這個方案,盡管我們用了wchar但全然沒有突出我們的目的,它仍然是一個中文字占兩個wchar_t單位。並且我們也沒有辦法對裏面的漢字字符進行操作所以這是不可行的,但這是C的使用方法。在C++中wchar則對其進行了改動,使得中文的支持更加好了。

C++中,wchar_t是語言內建的數據類型。wchar_t的長度是由實現決定的。

如今我們正式開始討論中文在我們的C++中的支持和應用的問題。

C++是一種非常好的語言,它為了適合不同的地域語言的開發,它增加了一個叫做locale包的頭文件。裏面定義了不同語言和語言的縮寫。這是我們使用wchar_t進行中文的個方面的操作的一個重要的環節。對於我們的輸入輸出有非常重要的影響。

首先我們的應用事例是這種:

#include <iostream>

#include <locale>

using namespace std;

int main()

{

locale loc( "Chinese-simplified" );

wcin.imbue(loc);

wcout.imbue( loc );

//上面三行代碼和setlocale(LC_ALL,"chs");作用是一樣的。

wchar_t c[4];

wcin >> c;

wcout << c <<endl;

return 0;

}

在這裏我門用到了#include <locale> 用來包括這個頭文件,然後生成一個locale的對象。裏面的參數是僅僅採用中文,接著我們對我們的輸入和輸出進行imbue的設置。是用來Changes the locale的作用。於是我們輸入和輸出就會變成我們所須要的以中文字的為單位的存儲過程。上例中的c[4] 則能夠輸入3個中文字,最後一個是’\0’,這樣就初步達到了我們所要求的效果。同一時候我們就能夠取出我們要的每一個定位的中文字符,進行和char相同的數據處理。




中文在C/C++中的處理和漢字亂碼問題(wchar_t)