宽字符串和标准字符串的互相转换

本篇文章主要介绍宽字符串和标准字符串的互相转换,对中文处理非常有用,标准字符串如果想输出一个单汉字需要连续输出两个字节,比较麻烦,下面给出一个完整的转换程序,希望对看到本文章的人有帮助!

#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

你可能感兴趣的:(宽字符串和标准字符串的互相转换)