我需要使用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,如果不改变语言环境,这是不可能的:
现在我决定制作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);
结果仍然令人伤心:
另一方面我期待什么?我需要以某种方式告诉系统应该使用哪个代码页来显示可能的字符。怎么做?
答案 0 :(得分:0)
您的解决方案存在的问题是MultiByteToWideChar
CodePage
参数CP_UTF8
函数无法将您的SPECIFIC ASCII
代码页转换为UTF-16
,它将UTF-8
翻译为UTF-16
,这不是您所需要的。
您正在寻找的是ISO/IEC 8859-13
至WideChar
中字符的翻译表。您可以在https://en.wikipedia.org/wiki/ISO/IEC_8859-13中的表格中手动创建一个,例如160
变为00A0
,161
变为201D
,依此类推。