简体中文windows2k server,在简体中文vc6中,我把一个繁体的字符串附给一个CString变量:
CString strTemp;
strTemp = _T("...");  // 里边是一些繁体的字
然后用CDC类把这个字符串从打印机打印出来。
编译程序,在我的电脑上可以正常打印,但拿到繁体系统(windows2k和windows98)上打印出来的却是乱码 
  怎么办?

解决方案 »

  1.   

    繁体系统如果用GBK编码,看字体
    如果big5编码,要先转换成big5
      

  2.   

    CFont ftBig;
    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上都打印的乱码
      

  3.   

    strTemp = _T("...");  // 里边是一些繁体的字
    是用的什么编码?如果是简体机可以打印说明是GB码(中国标准),在繁体windows上就是乱码。
    要想在繁体windows上使用就要转换为BIG5码(台湾标准)。
      

  4.   

    要想在繁体windows上使用就要转换为BIG5码(台湾标准)。
    ------------------------------------------------------------
    怎么转换?用MultiByteToWideChar吗?
      

  5.   

    是的,先用 MULTIBYTETOWIDECHAR 把 GBK 转换为UNICODE,再用WIDECHARTOMULTIBYTE把UNICODE转换为BIG5. 不过还是推荐你的程序直接使用UNICODE(注意,98不支持UNICODE,也不支持这种GBK转BIG5的方法)。
      

  6.   

    过还是推荐你的程序直接使用UNICODE
    -----------------------------------------
    怎么用?
    我声明 CString 的变量后,在用它之前或者用的时候,还需要怎么处理?
      

  7.   

    设置工程为UNICODE的方法是:首先在project-> settings->C/C++的属性页中的Preprocessor中,删除_MBCS写入UNICODE,_UNICODE。然后在link属性页中Category中选择output,在Entry-Point symbol 中添加wWinMainCRTStartup。不过UNICODE环境下,你的代码中可能有些地方会无法编译,比如你没有用 _T("")的地方、读入文本文件的地方等等。如果对UNICODE环境不熟,还是建议用 GBK 转换BIG5的方法.
      

  8.   

    转换的话,code page 处怎么设置?
    两步:
    1. 把CString 转换成unicdoe时,code page 用CP_ACP吗?
    2. 把unicode 转换成big5时,code page 没有big5这个代码,怎么办?是直接用big5的编码号吗?我的QQ:63199542
      

  9.   

    GBK 的CODEPAGE是936,
    BIG5 是 950
    这里有文章介绍:
    http://dev.csdn.net/article/34/34208.shtm
      

  10.   

    这是我写的一个转换函数,但是总是不正确, strTo的内容乱七八糟的
    // 把一个简体中文字符串转换成繁体字
    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 );
    }
      

  11.   

    // 转换成big5
    WideCharToMultiByte( 950, 0, (char*)cUnicode,
    iTemp, strTo, 128 );
      

  12.   

    你用GB2312的编码当然不行了!~ 因为这个编码只支持大陆的简体中文后来国家就此大陆和台湾的汉字编码不编一的缺点,特别推出了新的 中国字符编码,称为GBK,这种编码同时支持大陆(GB2312)和台湾(BIG5)的两种编码文字,又新增了一些不常用的符号strTemp = _T("...");  // 里边是一些繁体的字 ???  
    里边是一些繁体字? 说明你得到的是已经编过码的字符串,你就不能再进行编码了
    如果你得到的是已经编码后的字符串,你需要先将其按相应的字符集解码,然后再用新的字符集GBK进行编码,此时你得到的字符就正常显示了
    MultiByteToWideChar    //先将GB2312解码成Unicode
    WideCharToMultiByte    //再将Unicode编码成GBK ,就可以了
      

  13.   

    再次提醒GB2312 = 大陆简体中文编码
    BIG5   = 台湾繁体中文编码
    GBK    = 包含中国简繁两种文字的全部编码(及一些新增特殊符号)
      

  14.   

    有两种情况:1. 这是我开始时候的方法。在繁体系统上写出字符串,然后我把它copy到我的程序里边,就是上边说的  strTemp = _T("...");  // 里边是一些繁体的字 
    这时候我可以在我的简体系统上打印,打印出来就是繁体字,但是我拿到繁体系统上打印的就是乱码
    这个我没有转换,即直接把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 );
    }
      

  15.   

    以下代码测试通过。需要windows NT4以上操作系统,不支持win9x{
    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;
    }
      

  16.   

    用IE打开c:\test.htm, 选择IE的编码为 BIG5,即可看到字符串的繁体版本。
      

  17.   

    我把这个转换函数按照你的顺序写,还是不行
    在我的简体系统上打印出来的还是乱码,繁体系统上还没有测试,但是如果直接用繁体字符串的话,我的简体上就可以正常打印(中间不经过这个函数的转换)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 );
    }
      

  18.   

    在我的简体系统上打印出来的还是乱码
    -----------------
    你不是因为在繁体系统上有乱码才来问问题的吗?我的这段代码转出来是BIG5的,在简体系统上当然会是乱码了。在繁体系统上会是正常的。
    但是如果直接用繁体字符串的话,我的简体上就可以正常打印
    ----------------
    那你在繁体系统中肯定是乱码
    简体系统和繁体系统你要区别对待!
      

  19.   

    试过了,用转换函数在繁体windows2000上可以正常打印
    哎,还是麻烦,在简体上就得直接用繁体字符串了结贴