Chromium源代码WideToASCII函数

2010年1月27日 | 分类: C/C++ | 标签: , ,

在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。

目前还没有任何评论.