使用WideCharToMultiByte转化的话,转换超过128的会出现'?'
想知道怎么能转换包含超过128的Unicode字符串

解决方案 »

  1.   

    就是BSTR->char*
    如果这个BSTR包含超过128的一个数字,比如我给其中一个赋值0xff,转过过来的char就是‘?’
    因为WideCharToMultiByte转换的是ANSI,而ff超过了ANSI的定义现在就是想知道怎么样才能转换超过128的,也可以成功
      

  2.   

    void CTest23Dlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    BSTR pString; 
    CString cString;

    cString = CString(' ', 1);
    pString = cString.AllocSysString();
    pString[0] = 128+1; char buf[10] = {0}; int nCount = SysStringLen(pString); WideCharToMultiByte(
            CP_ACP,         // code page
            0,              // performance and mapping flags
            pString,           // address of wide character string
            nCount,         // number of characters in string
            buf,        // address of buffer for new string
            nCount*2,       // size of buffer
                            //   This is worst case (every wide -> multi-byte char).
                            //   We assume that the caller passed a big enough buffer.
            NULL,           // address of default for unmappable characters
            NULL );
    //转换后,buf[0] == 63,就是'?'
    //希望的结果是转换后buf[0] == 128+1
    }
      

  3.   


    楼主:『Windows程序设计』的第二章『宽字符和C』,你先看看!
    下载地址:http://blog.csdn.net/zaodt/archive/2007/11/25/1901332.aspx
      

  4.   

    很正常,另外你遇到的就是一部分情况,比如
    ff15(ucs2格式)转换出来就是5
    ff25转换出来就是E
      

  5.   

    这种转换是把Unicode字符串转换为指定代码页的Multibyte字符串,你需要先确定Unicode字符串是那种语言,然后转到相应的代码页,并不是随便一些数据都可以转。举个例子,假设你把一段日文转换到中文的代码页,可能转出来的都是?号。
      

  6.   


    那代码页怎么选择?
    我goto CP_ACP的定义,就看到一个代码页的定义阿
      

  7.   

    MSDN里面有,给你贴上:
    Code Page Identifiers
    Identifier Name 
    037 IBM EBCDIC - U.S./Canada 
    437 OEM - United States 
    500 IBM EBCDIC - International  
    708 Arabic - ASMO 708 
    709 Arabic - ASMO 449+, BCON V4 
    710 Arabic - Transparent Arabic 
    720 Arabic - Transparent ASMO 
    737 OEM - Greek (formerly 437G) 
    775 OEM - Baltic 
    850 OEM - Multilingual Latin I 
    852 OEM - Latin II 
    855 OEM - Cyrillic (primarily Russian) 
    857 OEM - Turkish 
    858 OEM - Multilingual Latin I + Euro symbol 
    860 OEM - Portuguese 
    861 OEM - Icelandic 
    862 OEM - Hebrew 
    863 OEM - Canadian-French 
    864 OEM - Arabic 
    865 OEM - Nordic 
    866 OEM - Russian 
    869 OEM - Modern Greek 
    870 IBM EBCDIC - Multilingual/ROECE (Latin-2) 
    874 ANSI/OEM - Thai (same as 28605, ISO 8859-15) 
    875 IBM EBCDIC - Modern Greek 
    932 ANSI/OEM - Japanese, Shift-JIS 
    936 ANSI/OEM - Simplified Chinese (PRC, Singapore) 
    949 ANSI/OEM - Korean (Unified Hangul Code) 
    950 ANSI/OEM - Traditional Chinese (Taiwan; Hong Kong SAR, PRC)  
    1026 IBM EBCDIC - Turkish (Latin-5) 
    1047 IBM EBCDIC - Latin 1/Open System 
    1140 IBM EBCDIC - U.S./Canada (037 + Euro symbol) 
    1141 IBM EBCDIC - Germany (20273 + Euro symbol) 
    1142 IBM EBCDIC - Den/Norway (20277 + Euro symbol) 
    1143 IBM EBCDIC - Finland/Sweden (20278 + Euro symbol) 
    1144 IBM EBCDIC - Italy (20280 + Euro symbol) 
    1145 IBM EBCDIC - Latin America/Spain (20284 + Euro symbol) 
    1146 IBM EBCDIC - United Kingdom (20285 + Euro symbol) 
    1147 IBM EBCDIC - France (20297 + Euro symbol) 
    1148 IBM EBCDIC - International (500 + Euro symbol) 
    1149 IBM EBCDIC - Icelandic (20871 + Euro symbol) 
    1200 Unicode UCS-2 Little-Endian (BMP of ISO 10646) 
    1201 Unicode UCS-2 Big-Endian  
    1250 ANSI - Central European  
    1251 ANSI - Cyrillic 
    1252 ANSI - Latin I  
    1253 ANSI - Greek 
    1254 ANSI - Turkish 
    1255 ANSI - Hebrew 
    1256 ANSI - Arabic 
    1257 ANSI - Baltic 
    1258 ANSI/OEM - Vietnamese 
    1361 Korean (Johab) 
    10000 MAC - Roman 
    10001 MAC - Japanese 
    10002 MAC - Traditional Chinese (Big5) 
    10003 MAC - Korean 
    10004 MAC - Arabic 
    10005 MAC - Hebrew 
    10006 MAC - Greek I 
    10007 MAC - Cyrillic 
    10008 MAC - Simplified Chinese (GB 2312) 
    10010 MAC - Romania 
    10017 MAC - Ukraine 
    10021 MAC - Thai 
    10029 MAC - Latin II 
    10079 MAC - Icelandic 
    10081 MAC - Turkish 
    10082 MAC - Croatia 
    12000 Unicode UCS-4 Little-Endian 
    12001 Unicode UCS-4 Big-Endian 
    20000 CNS - Taiwan  
    20001 TCA - Taiwan  
    20002 Eten - Taiwan  
    20003 IBM5550 - Taiwan  
    20004 TeleText - Taiwan  
    20005 Wang - Taiwan  
    20105 IA5 IRV International Alphabet No. 5 (7-bit) 
    20106 IA5 German (7-bit) 
    20107 IA5 Swedish (7-bit) 
    20108 IA5 Norwegian (7-bit) 
    20127 US-ASCII (7-bit) 
    20261 T.61 
    20269 ISO 6937 Non-Spacing Accent 
    20273 IBM EBCDIC - Germany 
    20277 IBM EBCDIC - Den/Norway 
    20278 IBM EBCDIC - Finland/Sweden 
    20280 IBM EBCDIC - Italy 
    20284 IBM EBCDIC - Latin America/Spain 
    20285 IBM EBCDIC - United Kingdom 
    20290 IBM EBCDIC - Japanese Katakana Extended 
    20297 IBM EBCDIC - France 
    20420 IBM EBCDIC - Arabic 
    20423 IBM EBCDIC - Greek 
    20424 IBM EBCDIC - Hebrew 
    20833 IBM EBCDIC - Korean Extended 
    20838 IBM EBCDIC - Thai 
    20866 Russian - KOI8-R 
    20871 IBM EBCDIC - Icelandic 
    20880 IBM EBCDIC - Cyrillic (Russian) 
    20905 IBM EBCDIC - Turkish 
    20924 IBM EBCDIC - Latin-1/Open System (1047 + Euro symbol) 
    20932 JIS X 0208-1990 & 0121-1990 
    20936 Simplified Chinese (GB2312) 
    21025 IBM EBCDIC - Cyrillic (Serbian, Bulgarian) 
    21027 (deprecated) 
    21866 Ukrainian (KOI8-U) 
    28591 ISO 8859-1 Latin I 
    28592 ISO 8859-2 Central Europe 
    28593 ISO 8859-3 Latin 3  
    28594 ISO 8859-4 Baltic 
    28595 ISO 8859-5 Cyrillic 
    28596 ISO 8859-6 Arabic 
    28597 ISO 8859-7 Greek 
    28598 ISO 8859-8 Hebrew 
    28599 ISO 8859-9 Latin 5 
    28605 ISO 8859-15 Latin 9 
    29001 Europa 3 
    38598 ISO 8859-8 Hebrew 
    50220 ISO 2022 Japanese with no halfwidth Katakana 
    50221 ISO 2022 Japanese with halfwidth Katakana 
    50222 ISO 2022 Japanese JIS X 0201-1989 
    50225 ISO 2022 Korean  
    50227 ISO 2022 Simplified Chinese 
    50229 ISO 2022 Traditional Chinese 
    50930 Japanese (Katakana) Extended 
    50931 US/Canada and Japanese 
    50933 Korean Extended and Korean 
    50935 Simplified Chinese Extended and Simplified Chinese 
    50936 Simplified Chinese 
    50937 US/Canada and Traditional Chinese 
    50939 Japanese (Latin) Extended and Japanese 
    51932 EUC - Japanese 
    51936 EUC - Simplified Chinese 
    51949 EUC - Korean 
    51950 EUC - Traditional Chinese 
    52936 HZ-GB2312 Simplified Chinese  
    54936 Windows XP: GB18030 Simplified Chinese (4 Byte)  
    57002 ISCII Devanagari 
    57003 ISCII Bengali 
    57004 ISCII Tamil 
    57005 ISCII Telugu 
    57006 ISCII Assamese 
    57007 ISCII Oriya 
    57008 ISCII Kannada 
    57009 ISCII Malayalam 
    57010 ISCII Gujarati 
    57011 ISCII Punjabi 
    65000 Unicode UTF-7 
    65001 Unicode UTF-8 
      

  8.   

    UNICODE中针对代码页都划定了范围,所以混合使用是没有问题的,问题的关键是某个UNICODE编码不是一个合法的字符,转换一定失败。
      

  9.   

    这个问题是在做OPOS的时候遇到的,当时刚接触,后来发现OPOS专门提供了这种超过128的字符的处理,所以我的问题也就不存在了
    但是,我之前搜索到一个转换的方法,就是简单拷贝内存
    我测试了一下,是可以的,发商来给大家看一看,谢谢各位,揭帖
    BSTR pString; 
    CString cString; cString = CString(' ', 5); 
    pString = cString.AllocSysString(); 
    pString[0] = 0x1b; 
    pString[1] = 0x74;
    pString[2] = 0x00;
    pString[3] = 0x80;
    pString[4] = 0x81;char buf[10] = {0}; int nCount = SysStringLen(pString); for(int i=0;i<nCount;i++)
    *(buf+i) = (char)*(pString+i);unsigned char uc[6];
    memcpy(uc, buf,5);