在MessageBox中显示区域字符而不设置必需的区域设置

时间:2014-09-09 09:53:32

标签: visual-c++ unicode character-encoding

我需要使用MessageBox代码页中描述的区域字符显示ISO/IEC 8859-13,而不将Windows区域设置设置为此区域。我很天真,并试图用一个字节字符显示ASCI表:

void showCodePage()
{


    char *a = new char[10000];
    char *aa = new char[10000];
    int f=0;
    int lines =0;
    for (int i=1; i<255;i++ )
    {
        sprintf(a,"%c %0.3d ",i,i);
        sprintf(aa,"%c",i);
        f++;
        a+=6;
        aa++;

        if (f==8)
        {
            f=0;
            sprintf(a,"%c",0x0d);
            a++;
            lines++;
        }

    }

    *aa=0;
    *a=0;
    a-=254*6+lines;
    aa-=254;


    MessageBox(NULL, aa , "Hello!", MB_ICONEXCLAMATION | MB_OK);
    MessageBox(NULL, a  , "Hello!", MB_ICONEXCLAMATION | MB_OK);

    delete [] a;
    delete [] aa;

}

好的,这没有正确显示ISO / IEC 8859-13,如果不改变语言环境,这是不可能的:

enter image description here

现在我决定制作unicode wstring。从单字节char转换为unicode wchar函数:

wstring convert( const std::string& as )
{
    // deal with trivial case of empty string
    if( as.empty() )    return std::wstring();

    // determine required length of new string
    size_t reqLength = ::MultiByteToWideChar( CP_UTF8, 0, as.c_str(), (int)as.length(), 0, 0 );

    // construct new string of required length
    std::wstring ret( reqLength, L'\0' );

    // convert old string to new string
    ::MultiByteToWideChar( CP_UTF8, 0, as.c_str(), (int)as.length(), &ret[0], (int)ret.length() );

    // return new string ( compiler should optimize this away )
    return ret;
}

更改MessageBox'es:

MessageBoxW(NULL, convert(aa).c_str(), L"Hello!", MB_ICONEXCLAMATION | MB_OK);
MessageBoxW(NULL, convert(a).c_str() , L"Hello!", MB_ICONEXCLAMATION | MB_OK);

结果仍然令人伤心:

enter image description here

另一方面我期待什么?我需要以某种方式告诉系统应该使用哪个代码页来显示可能的字符。怎么做?

1 个答案:

答案 0 :(得分:0)

您的解决方案存在的问题是MultiByteToWideChar CodePage参数CP_UTF8函数无法将您的SPECIFIC ASCII代码页转换为UTF-16,它将UTF-8翻译为UTF-16,这不是您所需要的。

您正在寻找的是ISO/IEC 8859-13WideChar中字符的翻译表。您可以在https://en.wikipedia.org/wiki/ISO/IEC_8859-13中的表格中手动创建一个,例如160变为00A0161变为201D,依此类推。