我试图通过MFC应用程序显示Unicode孟加拉语,这是印度的母语,如下所示:
CFont *m_pFontSmallBN = new CFont();
m_pFontSmallBN->CreateFont(34,0,0,0,600,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,
_T("Ekushey Lalsalu")); //"Ekushey Lalsalu" is the Bengali Font name here.
CStatic m_msg_bn;
m_msg_bn.SetFont(m_pFontSmallBN,TRUE);
m_msg_bn.SetWindowText(_T("TEXT IN NATIVE LANGUAGE")); //TEXT is typed with the Font
虽然我在Windows Vista中运行该应用程序,但它可以完美地显示文本;但在Windows XP中,它无法正确显示unicode字符。 bengali语言的复合字母(以多个unicode字符为框架)显示为单独的字符。我确保Windows Vista和XP都安装了Font,并且我的MFC项目设置的字符集是Unicode。
有人可以帮我在Windows XP环境中找出问题吗?
答案 0 :(得分:1)
在Windows中选择字体很棘手。您希望字体名称优先于所有其他字体特征,但情况并非总是如此。为确保获得正确的字体,您应该确保 all CreateFont
的参数与您想要的字体匹配。本文虽然陈旧,但详细介绍了字体映射过程:Windows Font Mapping。
这是一个小程序,它会显示一个字体选择对话框并转储您可以传递给CreateFont
的参数,以保证您获得所需的字体。
#include <Windows.h>
#include <stdio.h>
int wmain(int argc, wchar_t* argv[])
{
LOGFONT lf = {};
CHOOSEFONT cf = {sizeof(CHOOSEFONT)};
cf.lpLogFont = &lf;
cf.Flags = CF_BOTH | CF_FORCEFONTEXIST;
if (ChooseFont(&cf))
{
wprintf(L"%d,%d,%d,%d,%d,", lf.lfHeight, lf.lfWidth, lf.lfEscapement, lf.lfOrientation, lf.lfWeight);
wprintf(L"%d,%d,%d,%d,%d,", lf.lfItalic, lf.lfUnderline, lf.lfStrikeOut, lf.lfCharSet, lf.lfOutPrecision);
wprintf(L"%d,%d,%d,", lf.lfClipPrecision, lf.lfQuality, lf.lfPitchAndFamily);
wprintf(L"_T(\"%s\")\n", lf.lfFaceName);
}
return 0;
}
答案 1 :(得分:0)
@Mark我无法使用&#34添加我的评论;添加评论&#34;链接;因此,我在这里添加它。即使在XP环境中,程序也会为Font属性显示相同的值。另一件事是使用相同系统的记事本,我看到同样不正确的显示。它可以显示孟加拉语字体,但显示不适用于孟加拉语的复合字母表(辅音合音或用元音的变音形式附加的辅音)。这可能是由于XP默认情况下没有为本机脚本(如bengali)的复杂文本提供内置支持。从Vista及以后的Windows默认启用此复杂文本支持;因此,只需安装本机unicode字体,我们就可以正确查看本机脚本。