免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5234 | 回复: 2
打印 上一主题 下一主题

[C++] 一个关于string转wstring时英文字符的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-11 21:10 |只看该作者 |倒序浏览
#include<iostream>
#include<fstream>
#include<string>
#include<map>
#include<locale>
using namespace std;

wstring* replace_str(wstring &str_str,wchar_t c_wchr,wchar_t nc_wchr);
std::wstring s2ws(const std::string& s);
std::string ws2s(const wstring& ws);

int main(int argc, char *argv[])
{
        /*设置区域化输出*/
        //setlocale(LC_ALL, "chinese-simplified");
        locale loc( "chs" );
    //locale loc( "Chinese-simplified" );
    //locale loc( "ZHI" );
    //locale loc( ".936" );
    wcout.imbue(loc);
        /*设置区域化输出*/
...
...
...
...
       
        ifstream inFile;
        if (argc == 1) {
                cerr << "请输入正确的参数!" << endl;
                return EXIT_FAILURE;
        }
        inFile.open(argv[1]);
        if (!inFile) {
                cerr << "无法打开文件:" << endl;
                return EXIT_FAILURE;
        }
        wstring content;
        string line, tmpws;
        while(getline(inFile, line)) {
                tmpws = tmpws + line + "\n";
        }
        cout << tmpws << endl;
        content = s2ws(tmpws);

        for(map<wchar_t, wchar_t>::const_iterator iter = mps.begin(); iter != mps.end(); ++iter)
        {
                replace_str(content, iter->first, iter->second);
        }
        wcout << content << endl;

        inFile.close();

        return 0;
}

wstring* replace_str(wstring &str_str,wchar_t c_wchr,wchar_t nc_wchr)
{
        for(wstring::iterator iter = str_str.begin(); iter != str_str.end(); ++iter)
                if (*iter == c_wchr)
                        *iter = nc_wchr;
        return &str_str;
}

string ws2s(const std::wstring& ws)
{
    std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";
    setlocale(LC_ALL, "chs");
    const wchar_t* _Source = ws.c_str();
    size_t _Dsize = 2 * ws.size() + 1;
    char *_Dest = new char[_Dsize];
    memset(_Dest,0,_Dsize);
    wcstombs(_Dest,_Source,_Dsize);
    std::string result = _Dest;
    delete []_Dest;
    setlocale(LC_ALL, curLocale.c_str());
    return result;
}

wstring s2ws(const std::string& s)
{
    setlocale(LC_ALL, "chs");
    const char* _Source = s.c_str();
    size_t _Dsize = s.size() + 1;
    wchar_t *_Dest = new wchar_t[_Dsize];
    wmemset(_Dest, 0, _Dsize);
    mbstowcs(_Dest,_Source,_Dsize);
    std::wstring result = _Dest;
    delete []_Dest;
    setlocale(LC_ALL, "C");
    return result;
}


任务:从文件中读入中英混排的文本文件,要把其中部份字更换成其他字。

刚开始使用的是普通的string及char实现替换,但是因为替换时会出现二次替换和多次替换的情况而出现乱码,因此想通过把字符转为wchar_t类型,string转换为wstring再操作。

刚开始测试时使用的是纯汉字,没有换行,效果很好,但是当string中有字母和标点符号及换行符时,转变后的wstring就会从出现字母或标点及换行符处开始变成乱码。

转换函数是从网上找的,这种情况怎么解决呢????难道string转到wstring只限于汉字吗????

谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-04-11 21:31 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2009-04-11 22:24 |只看该作者
不了解wstring 没用过 呵呵
如果要考虑类似LZ这种问题 我都是用c利用utf-8编码自己处理 汉字在utf8编码占3个字节

如果LZ也愿意参考的话 你可以看下rfc2279、rfc3629、rfc2781等
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP