C++中文字符处理(宽字符转换)
std::string vs std::wstring
一般情况下,我们使用c++处理字符串都使用的是string来处理。但在处理中文时,string的一些方法不能达到我们想要的效果,比如:size()函数返回的是中文字符串所占的字节数。
1
2string s = "今天天气123";
cout << s.size() << endl;1
15
这里我们使用宽字符就可以达到目的: 1
2wstring s = L"今天天气123";
cout << s.size() << endl;1
7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
std::wstring s2ws(const std::string& str) {
using convert_typeX = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_typeX, wchar_t> converterX;
return converterX.from_bytes(str);
}
std::string ws2s(const std::wstring& wstr) {
using convert_typeX = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_typeX, wchar_t> converterX;
return converterX.to_bytes(wstr);
}
gcc 4.8
对于gcc4.8就只能使用clib的函数来转换了。
主要用到的是:wcstombs() 和 mbstowcs()
wcstombs
函数说明:
#include
std::size_t wcstombs( char dst, const wchar_t src, std::size_t len);
从wchar_t* src转换成char* dst,len为dst buffer的最大值。
返回值为转换的字节数(不包括\0),出错返回 -1.
举例
1 |
|
1 | 4 |
mbstowcs
函数说明:
#include
std::size_t mbstowcs( wchar_t dst, const char src, std::size_t len);
从char* src转换到wchar_t* dst,len为dst buffer的最大值。
返回值为宽字节个数(不包括\0),出错返回 -1。
举例
1 |
|
1 | 15 |
find举例
1 | //接上块代码 |
1 | ws find:2 |
wstring会直接返回中文字符数。string的find会返回实际字节数。
引用
How to convert wstring into string?