Chromium源代码WideToASCII函数
在Chromium(Google Chrome浏览器的开源项目)源代码里看到一个字符串转换函数WideToASCII:
#include <iostream> #include <string> std::string WideToASCII(const std::wstring& wide) { return std::string(wide.begin(), wide.end()); } int main() { std::wstring ws(L"Test String"); std::string s(WideToASCII(ws)); std::wcout << L"Wide: " << ws << std::endl; std::cout << "ASCII: " << s << std::endl; return 0; }
转换过程直接从wstring的迭代器构造string,这种无比简洁的转换写法还是第一次看到,跟踪了一下string的构造函数,发现内部直接把wstring的迭代器取值然后强转为char,上面的代码基本等于如下:
#include <iostream> #include <string> std::string WideToASCII(const std::wstring& wide) { std::string s; for (std::wstring::const_iterator it = wide.begin(); it != wide.end(); ++it) s.append(1, (char)*it); return s; } int main() { std::wstring ws(L"Test String"); std::string s(WideToASCII(ws)); std::wcout << L"Wide: " << ws << std::endl; std::cout << "ASCII: " << s << std::endl; return 0; }
这样的强转会把wstring里每个字符的第2个字节给丢弃了,所以WideToASCII没法处理中文,只能是ToASCII。
发表评论
| Trackback
