1. 程式人生 > >wchar_t和wstring型別輸出問題

wchar_t和wstring型別輸出問題

請問怎麼才能輸出wchar_t和wstring型別的字串,用cout輸出不了,用wcout編譯提示沒這個東西.

DEV-C++環境.
#include<iostream>
#include<conio.h>
#include<string>

using namespace std;

int main()
{
  char s1[]="char";
  wchar_t s2[]=L"wchar_t"; 
//wstring ws=L"wstring";

  cout<<"s1="<<s1<<endl;
  cout<<"s2="<<s2<<endl;//輸出的是個地址
//cout<<ws<<endl;      //編譯提示錯誤
  
    
    getch();
    return 0;
}

----------------------------------------------------------------------

wcout不是每個平臺都支援的-_-

--------------------------------------------------------

wcout  在 VC 環境下使用

--------------------------------------------------------

wchar_t 使用對應的寬字元版本操作函式即可

【引用
比如求寬字串長度的函式是
size_t __cdel wchlen(const wchar_t*);
  為什麼要專門定義這些函式呢?最根本的原因是,ANSI下的字串都是以’/0’來標識字串尾的(Unicode字串以“/0/0”結束),許多字串函式的正確操作均是以此為基礎進行。而我們知道,在寬字元的情況下,一個字元在記憶體中要佔據一個字的空間,這就會使操作ANSI字元的字串函式無法正確操作。以”Hello”字串為例,在寬字元下,它的五個字元是:
0x0048 0x0065 0x006c 0x006c 0x006f
在記憶體中,實際的排列是:

48 00 65 00 6c 00 6c 00 6f 00
  於是,ANSI字串函式,如strlen,在碰到第一個48後的00時,就會認為字串到尾了,用strlen對寬字串求長度的結果就永遠會是1!


--------------------------------------------------------

寬字元處理函式函式與普通函式對照表 
  
 

字元分類: 寬字元函式普通C函式描述 
iswalnum() isalnum() 測試字元是否為數字或字母 
iswalpha() isalpha() 測試字元是否是字母 
iswcntrl() iscntrl() 測試字元是否是控制符 
iswdigit() isdigit() 測試字元是否為數字 
iswgraph() isgraph() 測試字元是否是可見字元 
iswlower() islower() 測試字元是否是小寫字元 
iswprint() isprint() 測試字元是否是可列印字元 
iswpunct() ispunct() 測試字元是否是標點符號 
iswspace() isspace() 測試字元是否是空白符號 
iswupper() isupper() 測試字元是否是大寫字元 
iswxdigit() isxdigit()測試字元是否是十六進位制的數字 


大小寫轉換: 
寬字元函式普通C函式描述 
towlower() tolower() 把字元轉換為小寫 
towupper() toupper() 把字元轉換為大寫 


字元比較: 寬字元函式普通C函式描述 
wcscoll() strcoll() 比較字串 


日期和時間轉換: 
寬字元函式描述 
strftime() 根據指定的字串格式和locale設定格式化日期和時間 
wcsftime() 根據指定的字串格式和locale設定格式化日期和時間, 並返回寬字串 
strptime() 根據指定格式把字串轉換為時間值, 是strftime的反過程 


列印和掃描字串: 
寬字元函式描述 
fprintf()/fwprintf() 使用vararg參量的格式化輸出 
fscanf()/fwscanf() 格式化讀入 
printf() 使用vararg參量的格式化輸出到標準輸出 
scanf() 從標準輸入的格式化讀入 
sprintf()/swprintf() 根據vararg參量表格式化成字串 
sscanf() 以字串作格式化讀入 
vfprintf()/vfwprintf() 使用stdarg參量表格式化輸出到檔案 
vprintf() 使用stdarg參量表格式化輸出到標準輸出 
vsprintf()/vswprintf() 格式化stdarg參量表並寫到字串 


數字轉換: 
寬字元函式普通C函式描述 
wcstod() strtod()  把寬字元的初始部分轉換為雙精度浮點數 
wcstol() strtol()  把寬字元的初始部分轉換為長整數 
wcstoul() strtoul() 把寬字元的初始部分轉換為無符號長整數 


多位元組字元和寬字元轉換及操作: 
寬字元函式描述 
mblen() 根據locale的設定確定字元的位元組數 
mbstowcs() 把多位元組字串轉換為寬字串 
mbtowc()/btowc()把多位元組字元轉換為寬字元 
wcstombs() 把寬字串轉換為多位元組字串 
wctomb()/wctob() 把寬字元轉換為多位元組字元 


輸入和輸出: 
寬字元函式普通C函式描述 
fgetwc() fgetc() 從流中讀入一個字元並轉換為寬字元 
fgetws() fgets() 從流中讀入一個字串並轉換為寬字串 
fputwc() fputc() 把寬字元轉換為多位元組字元並且輸出到標準輸出 
fputws() fputs() 把寬字串轉換為多位元組字元並且輸出到標準輸出串 
getwc() getc() 從標準輸入中讀取字元, 並且轉換為寬字元 
getwchar() getchar() 從標準輸入中讀取字元, 並且轉換為寬字元 
None gets() 使用fgetws() 
putwc() putc() 把寬字元轉換成多位元組字元並且寫到標準輸出 
putwchar() putchar() 把寬字元轉換成多位元組字元並且寫到標準輸出 
None puts() 使用fputws() 
ungetwc() ungetc() 把一個寬字元放回到輸入流中 


字串操作: 
寬字元函式普通C函式描述 
wcscat() strcat() 把一個字串接到另一個字串的尾部 
wcsncat() strncat() 類似於wcscat(), 而且指定粘接字串的粘接長度. 
wcschr() strchr() 查詢子字串的第一個位置 
wcsrchr() strrchr() 從尾部開始查詢子字串出現的第一個位置 
wcspbrk() strpbrk() 從一字元字串中查詢另一字串中任何一個字元第一次出現的位置 
wcswcs()/wcsstr() strchr() 在一字串中查詢另一字串第一次出現的位置 
wcscspn() strcspn() 返回不包含第二個字串的的初始數目 
wcsspn() strspn() 返回包含第二個字串的初始數目 
wcscpy() strcpy() 拷貝字串 
wcsncpy() strncpy() 類似於wcscpy(), 同時指定拷貝的數目 
wcscmp() strcmp() 比較兩個寬字串 
wcsncmp() strncmp() 類似於wcscmp(), 還要指定比較字元字串的數目 
wcslen() strlen() 獲得寬字串的數目 
wcstok() strtok() 根據標示符把寬字串分解成一系列字串 
wcswidth() None 獲得寬字串的寬度 
wcwidth() None 獲得寬字元的寬度 


另外還有對應於memory操作的 wmemcpy(), wmemchr(), wmemcmp(), wmemmove(), wmemset().

--------------------------------------------------------

mark

--------------------------------------------------------

from: http://blog.vckbase.com/bruceteen/archive/2005/11/15/14924.aspx
補充:在mingw32中使用wcout和wstring需要加一些巨集,比如
#define _GLIBCXX_USE_WCHAR_T 1
#include <iostream>
int main( void )
{
    std::wcout << 1 << std::endl;
}
可以編譯通過,但無法Link通過,在網上google了一下,stlport說mingw32有問題,mingw32說是M$的c runtime有問題。

--------------------------------------------------------

感謝jixingzhong(瞌睡蟲·星辰) 列出的C函式.請問有沒有標準C++ I/O流下用到的寬字元輸入輸出?
我想自己實現一個wcout物件?
比如:basic_ostream<wchar_t,char_trait<wchar_t> > wo;//但這個定義報錯
上面的第二個模板引數(字元特性)應該怎麼寫?或者有什麼其他的寫法嗎?

--------------------------------------------------------