如题:
我用VC7做的一个控件
调用这个控件的函数,会返回一个中文的值给我的HTML页面显示,
在中文操作系统下能够正确显示,可在英文的操作系统下中文就
变成了乱码
当我在控件里面报一个MESSAGEBOX时显示,在英文的操作系统下面
也正确显示中文,可到了HTML页面里就成了乱码
IE的编码我也都做了各种尝试,但均未触发此问题,且直接写到页面
内的中文可以正确显示

解决方案 »

  1.   

    你的控件里是不是把char*转换成了BSTR?是怎么转换的?
      

  2.   

    是呀,我的控件都是返回一个BSTR类型的BSTR CDownLoadCtrl::GetStringByIndex(LONG index, LPCTSTR baseKeyName, LPCTSTR valueKeyName, LPCTSTR defaultValue)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); std::string value = ""; // TODO: 在此添加调度处理程序代码
    try{
    CXMLFile xmlFile;
    BSTR tmpBSTR = GetControlPath();
    CString path(tmpBSTR);
    SysFreeString(tmpBSTR);
    if(path.IsEmpty()) return 0;
    if(m_filePath.IsEmpty()) {
    return SysAllocString(L"error");
    }
    if(xmlFile.load(path + m_filePath))
    value = xmlFile.GetStringByIndex(index,"",valueKeyName,"");
    else
    return SysAllocString(L"error"); } catch (...) {
    //MessageBox("error");
    return SysAllocString(L"error");
    }
    CString tmp = _T(value.c_str());
    //MessageBox(tmp);
    return tmp.AllocSysString();

    }
      

  3.   

    你这个函数的参数全是LPCTSTR,不是BSTR啊。
    这种情况多发生在窄字符和BSTR之间转换时指定的转换内码不正确。
    你可以把整个程序发给我,或者做简化的例子。
    单从这段程序看不出问题。
      

  4.   

    这是那个控件的方法,和LPCTSTR没有关系的呀,因为都能够传进去,也能够正确
    的读出来,只是在网页里面就出错了
      

  5.   

    这是控件的interface中的方法吗?你是说哪个参数出错了?
    我感觉还是控件里的问题,在不同的语言环境里出错。
      

  6.   

    刚才查了一下:MFC中CString的AllocSysString函数是根据系统当前内码来转换的,如果是在英文版,它就根据英文内码转换,所以结果是乱码。你可以试试用下面这段代码取得BSTR。// return tmp.AllocSysString();int nLen = MultiByteToWideChar(CP_THREAD_ACP, 0, tmp, tmp.GetLength(), NULL, NULL);
    BSTR bstr = ::SysAllocStringLen(NULL, nLen);
    MultiByteToWideChar(CP_THREAD_ACP, 0, m_tmp, tmp.GetLength(), bstr, nLen);return bstr;
      

  7.   

    还有一个方法,就是编译unicode版本。unicode版本不需要转换,所以也不会乱码。
      

  8.   

    我试了,还是不行,转换为宽字符,还有就是我在英文操作系统下面取的值是正确的呀,
    我在控件里面写了一个MESSAGEBOX,正确的显示了值,可是放在页面里面就全错了,而且
    全变成了乱码的UNICODE编码,所有的汉字都是
      

  9.   

    只能用UNICODE编码,在stdafx.h中,所有include之前加上:
    #define _UNICODE看来只有这样才能满足你的要求了。