简体中文windows2k server,在简体中文vc6中,我把一个繁体的字符串附给一个CString变量:
CString strTemp;
strTemp = _T("..."); // 里边是一些繁体的字
然后用CDC类把这个字符串从打印机打印出来。
编译程序,在我的电脑上可以正常打印,但拿到繁体系统(windows2k和windows98)上打印出来的却是乱码
怎么办?
CString strTemp;
strTemp = _T("..."); // 里边是一些繁体的字
然后用CDC类把这个字符串从打印机打印出来。
编译程序,在我的电脑上可以正常打印,但拿到繁体系统(windows2k和windows98)上打印出来的却是乱码
怎么办?
解决方案 »
- 用new分配内存的问题
- 问个基础问题,有关Web浏览器控件的使用 VC++
- 哪位大哥给说明下CHtmlView::OnDocumentComplete()这个函数会在什么时候被触发执行?在线等着给分!
- tcp数据通信的时候为什么数据包会被自动分成多个包?
- CSocket 与 WinSock API
- 我想模拟WM_COMMAND
- 为什么单步执行可以成功,但直接运行程序却不成功??怪载。。。。
- 怎么生成这样一个选择对话框?
- 大家可否在这里讨论软件加密方法,目的是保护自己知识产权!或者说如何商业化!
- BCG && MFC 的问题,谢谢!!
- 怎么生成一个OBJ文件给别的编程语言使用
- 关于CAsyncSocket类在ActiveX控件中的问题
如果big5编码,要先转换成big5
CFont *pOldFont;
CString sTemp;
int iFtHeight;iFtHeight = 12;
sTemp = _T("Times New Roman");
ftBig.CreateFont( iFtHeight, 0, 2700, 2700, FW_MEDIUM, 0, 0, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, sTemp );pOldFont = dcPrinter.SelectObject( &ftBig );
... // 开始一个打印文档
strTemp = _T("..."); // 里边是一些繁体的字
dcPrinter.TextOut( iHortMiddle, iVertMiddle, sTemp ); // 打印到纸上
... // 结束处理结果在我的简体机上可以打印,但到繁体的98和2k上都打印的乱码
是用的什么编码?如果是简体机可以打印说明是GB码(中国标准),在繁体windows上就是乱码。
要想在繁体windows上使用就要转换为BIG5码(台湾标准)。
------------------------------------------------------------
怎么转换?用MultiByteToWideChar吗?
-----------------------------------------
怎么用?
我声明 CString 的变量后,在用它之前或者用的时候,还需要怎么处理?
两步:
1. 把CString 转换成unicdoe时,code page 用CP_ACP吗?
2. 把unicode 转换成big5时,code page 没有big5这个代码,怎么办?是直接用big5的编码号吗?我的QQ:63199542
BIG5 是 950
这里有文章介绍:
http://dev.csdn.net/article/34/34208.shtm
// 把一个简体中文字符串转换成繁体字
void StrToBIG5( CString strFrom, LPWSTR strTo )
{
WCHAR cUnicode[ 128 ];
int iTemp; // 要转换成unicode的长度
iTemp = MultiByteToWideChar( 936, 0, strFrom.GetBuffer(0),
strFrom.GetLength(), cUnicode, 0 ); // 转换成unicode
MultiByteToWideChar( 936, 0, strFrom.GetBuffer(0),
strFrom.GetLength(), cUnicode, iTemp ); // 转换成big5
MultiByteToWideChar( 950, 0, (char*)cUnicode,
iTemp, strTo, 128 );
}
WideCharToMultiByte( 950, 0, (char*)cUnicode,
iTemp, strTo, 128 );
里边是一些繁体字? 说明你得到的是已经编过码的字符串,你就不能再进行编码了
如果你得到的是已经编码后的字符串,你需要先将其按相应的字符集解码,然后再用新的字符集GBK进行编码,此时你得到的字符就正常显示了
MultiByteToWideChar //先将GB2312解码成Unicode
WideCharToMultiByte //再将Unicode编码成GBK ,就可以了
BIG5 = 台湾繁体中文编码
GBK = 包含中国简繁两种文字的全部编码(及一些新增特殊符号)
这时候我可以在我的简体系统上打印,打印出来就是繁体字,但是我拿到繁体系统上打印的就是乱码
这个我没有转换,即直接把strTemp打印出来2. 这是我用上边我写的那个函数进行转换,即现在用的方法。就在我的机子上写出相应字符串,当然是简体的。但是打印需要,需要把简体的转成繁体的打印,即打印出来应该是繁体字。用转换的方法有个好处,即我在写程序时可以看到字符串的内容,修改这些字符串也容易。但是这种转换总不成功,不论是在我的简体系统上还是在繁体系统上,打印的都是乱码// 这是我写的转换函数,把简体字符串转换成繁体字符串。现在转换不成功,帮我改一改吧
void StrToBIG5( CString strFrom, /*LPWSTR*/ char* strTo )
{
WCHAR cUnicode[ 128 ], cBig5Code[ 128 ];
char cTemp[128];
int iTemp, iLenTo; iLenTo = strlen( strTo );
memset( strTo, 0, iLenTo );
memset( cUnicode, 0, 128 );
memset( cBig5Code, 0, 128 );
memset( cTemp, 0, 128 ); // 要转换成unicode的长度
iTemp = MultiByteToWideChar( 936, 0, strFrom.GetBuffer(0),
strFrom.GetLength(), cUnicode, 0 ); // 转换成unicode
MultiByteToWideChar( 936, 0, strFrom.GetBuffer(0),
strFrom.GetLength(), cUnicode, iTemp ); // 把编码转换成big5
//iTemp = MultiByteToWideChar( 950, 0, (char*)cUnicode,
// iTemp, cBig5Code, 128 );
iTemp = WideCharToMultiByte( 950, 0, cUnicode, iTemp,
cTemp, 128, NULL, NULL ); // 把字形转换成big5(繁体字)
LCMapString( MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG), SORT_CHINESE_BIG5),
LCMAP_TRADITIONAL_CHINESE, cTemp, iTemp, strTo, iLenTo );
}
char szGBK[128] = "中华人民共和国";
WCHAR wszUnicode1[128];
WCHAR wszUnicode2[128];
char szBig5[128];
int iTemp; // 要转换成unicode的长度
iTemp = MultiByteToWideChar( 936, 0, szGBK, strlen( szGBK ), wszUnicode1, 0 ); // 转换成unicode
MultiByteToWideChar( 936, 0, szGBK, strlen( szGBK ), wszUnicode1, iTemp ); // 把字形转换成big5(繁体字)
LCMapStringW( MAKELCID( MAKELANGID( LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED ), SORT_CHINESE_PRCP ),
LCMAP_TRADITIONAL_CHINESE, wszUnicode1, iTemp, wszUnicode2, 128 ); // 把编码转换成big5
iTemp = WideCharToMultiByte( 950, 0, wszUnicode2, iTemp,
szBig5, 128, NULL, NULL );
szBig5[iTemp] = 0; FILE* fp = fopen( "c:\\test.htm", "wb" );
if( fp != NULL )
{
fwrite( szBig5, 1, strlen(szBig5), fp );
fclose( fp );
}
return FALSE;
}
在我的简体系统上打印出来的还是乱码,繁体系统上还没有测试,但是如果直接用繁体字符串的话,我的简体上就可以正常打印(中间不经过这个函数的转换)void StrToBIG5( CString strFrom, /*LPWSTR*/ char* strTo )
{
WCHAR cUnicode[ 128 ], cBig5Code[ 128 ];
char cTemp[128];
int iTemp, iLenTo; iLenTo = 128; //strlen( strTo );
memset( strTo, 0, iLenTo );
memset( cUnicode, 0, 128 );
memset( cBig5Code, 0, 128 );
memset( cTemp, 0, 128 ); // 要转换成unicode的长度
iTemp = MultiByteToWideChar( 936, 0, strFrom.GetBuffer(0),
strFrom.GetLength(), cUnicode, 0 ); // 转换成unicode
MultiByteToWideChar( 936, 0, strFrom.GetBuffer(0),
strFrom.GetLength(), cUnicode, iTemp ); // 把字形转换成big5(繁体字)
//LCMapString( MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG), SORT_CHINESE_BIG5),
// LCMAP_TRADITIONAL_CHINESE, cTemp, iTemp, strTo, iLenTo );
LCMapStringW( MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRCP),
LCMAP_TRADITIONAL_CHINESE, cUnicode, iTemp, cBig5Code, iLenTo ); // 把编码转换成big5
//iTemp = MultiByteToWideChar( 950, 0, (char*)cUnicode,
// iTemp, cBig5Code, 128 );
iTemp = WideCharToMultiByte( 950, 0, cBig5Code, iTemp,
strTo, iLenTo, NULL, NULL );
}
-----------------
你不是因为在繁体系统上有乱码才来问问题的吗?我的这段代码转出来是BIG5的,在简体系统上当然会是乱码了。在繁体系统上会是正常的。
但是如果直接用繁体字符串的话,我的简体上就可以正常打印
----------------
那你在繁体系统中肯定是乱码
简体系统和繁体系统你要区别对待!
哎,还是麻烦,在简体上就得直接用繁体字符串了结贴