本篇文章主要介绍宽字符串和标准字符串的互相转换,对中文处理非常有用,标准字符串如果想输出一个单汉字需要连续输出两个字节,比较麻烦,下面给出一个完整的转换程序,希望对看到本文章的人有帮助!
#include <iostream>
#include <string>
#include <locale>
using namespace std;
struct auto_setlocate {
auto_setlocate() {
setlocale(LC_ALL, "chs");
}
};
string WstringToString(const wchar_t* wch) {
auto_setlocate as;
string ret(wcslen(wch)*2, '\0');
wcstombs(const_cast<char*>(ret.c_str()), wch, ret.length());
return ret;
}
string WstringToString(const wstring& wstr) {
auto_setlocate as;
string ret(wstr.length()*2, '\0');
wcstombs(const_cast<char*>(ret.c_str()), wstr.c_str(), ret.length());
return ret;
}
wstring StringToWstring(const char* ch) {
auto_setlocate as;
wstring ret(strlen(ch)/2, '\0');
mbstowcs(const_cast<wchar_t*>(ret.c_str()), ch, strlen(ch));
return ret;
}
wstring StringToWstring(const string& str) {
auto_setlocate as;
wstring ret(str.length()/2, '\0');
mbstowcs(const_cast<wchar_t*>(ret.c_str()), str.c_str(), str.length());
return ret;
}
int main() {
// 都输出“中 中华人民共和国” ***janvyking999***
wcout.imbue(locale("chs"));
// 函数string WstringToString(const wchar_t* wch)
wchar_t* wct = L"中华人民共和国";
wcout<<wct[0]<<" "<<wct<<endl;
string str1 = WstringToString(wct);
cout<<str1[0]<<str1[1]<<" "<<str1<<endl;
// 函数string WstringToString(const wstring& wstr)
wstring wstr = L"中华人民共和国";
wcout<<wstr[0]<<" "<<wstr<<endl;
string str2 = WstringToString(wstr);
cout<<str2[0]<<str2[1]<<" "<<str2<<endl;
// 函数wstring StringToWstring(const char* ch)
char* chr = "中华人民共和国";
cout<<chr[0]<<chr[1]<<" "<<chr<<endl;
wstring wstr2 = StringToWstring(chr);
wcout<<wstr2[0]<<" "<<wstr2<<endl;
// 函数wstring StringToWstring(const string& str)
string str3 = "中华人民共和国";
cout<<str3[0]<<str3[1]<<" "<<str3<<endl;
wstring wstr1 = StringToWstring(str3);
wcout<<wstr1[0]<<" "<<wstr1<<endl;
return 0;
}
关于函数setlocale。
本函数用来配置地域的信息。参数 category 有下列的选择:
LC_ALL 包括下面的全项选项都要。
LC_COLLATE 配置字符串比较,PHP 目前尚未实作出来本项。
LC_CTYPE 配置字符类别及转换。例如全变大写 strtoupper()。
LC_MONETARY 配置金融货币,PHP 目前尚未实作。
LC_NUMERIC 配置小数点后的位数。
LC_TIME 配置时间日期格式,与 strftime() 合用。
而参数 locate 若是空字符串 "",则会使用系统环境变量的 locate 或是 LANG 的值。若 locate 为零,则不会改变地域化配置。返回新的地域,若系统尚未实作则返回 false。
另外,关于strlen,wcslen和lstrlen。
strlen() 返回ANSI字符串长度;
wcslen() 返回宽字符串长度(一般为UNICODE);
lstrlen() 该函数返回指定字符串的字节长度(ANSI版)或字符长度(双字节标准版);其中不包括终止NULL字符。 例:
#include <iostream>
#include <string>
#include <locale>
using namespace std;
int main() {
wchar_t* wct = L"中华人民共和国";
wstring wstr = L"中华人民共和国";
char* ch = "中华人民共和国";
string str = "中华人民共和国";
cout<<wcslen(wct)<<endl;
cout<<wstr.length()<<endl;
cout<<strlen(ch)<<endl;
cout<<str.length()<<endl;
return 0;
} //程序结果输出7,7,14,14
关于wcstombs和mbstowcs函数请参考MSDN。
size_t wcstombs( char *mbstr, const wchar_t *wcstr, size_t count );
mbstr: The address of a sequence of multibyte characters
wcstr: The address of a sequence of wide characters
count: The maximum number of bytes that can be stored in the multibyte output string
size_t mbstowcs( wchar_t *wcstr, const char *mbstr, size_t count );
wcstr: The address of a sequence of wide characters
mbstr: The address of a sequence of multibyte characters
count: The number of multibyte characters to convert