基本的なインタフェースとしては、IMultiLanguageを用いる。
以下に基本的なソースを示す。#include <COMDEF.H>
#include <MLANG.H>
#define COVS_0001 20106
#define COVS_0002 20108
#define COVS_0003 20107
#define COVS_0004 950
#define COVS_0005 50221
#define COVS_0006 51949
#define COVS_0007 936
#define COVS_0008 52936
#define COVS_0009 852
#define COVS_0010 966
#define COVS_0011 20105
#define COVS_0012 50220
#define COVS_0013 50222
#define COVS_0014 50225
#define COVS_0015 1252
#define COVS_0016 28591
#define COVS_0017 28592
#define COVS_0018 28593
#define COVS_0019 28594
#define COVS_0020 28595
#define COVS_0021 28596
#define COVS_0022 28597
#define COVS_0023 28598
#define COVS_0024 20866
#define COVS_0025 949
#define COVS_0026 932
#define COVS_0027 1200
#define COVS_0028 1201
#define COVS_0029 65000
#define COVS_0030 65001
#define COVS_0031 1250
#define COVS_0032 1251
#define COVS_0033 1252
#define COVS_0034 1253
#define COVS_0035 1254
#define COVS_0036 1255
#define COVS_0037 1256
#define COVS_0038 1257
#define COVS_0039 1258
#define COVS_0040 874
#define COVS_0041 51932
          
void CCodeIMultiLanguageDlg::OnButton1() 
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
HRESULT hr;
IMultiLanguage *pMultiLanguage;
UINT one=0;
UINT two=0;
DWORD pdwMode=0;
UCHAR* m_setstr;
UCHAR* m_getstr;
m_setstr=NULL;
m_getstr=NULL;
CoInitialize(NULL);
hr=CoCreateInstance(CLSID_CMultiLanguage ,NULL,CLSCTX_ALL,IID_IMultiLanguage ,(void**)&pMultiLanguage);
if( FAILED(hr))
{
return;
}
UpdateData( TRUE );
one=m_edt_before.GetLength();
m_setstr=(UCHAR*)m_edt_before.GetBuffer( m_edt_before.GetLength());
//SJISからUNICODEへ変換している。
hr=pMultiLanguage->ConvertString(&pdwMode,
COVS_0026,COVS_0030,(UCHAR*)m_setstr,&one,NULL,&two);
if( FAILED(hr))
{
goto error_data;
}
m_getstr=(UCHAR*)malloc( two + 1 );
memset( m_getstr, '\0', two + 1 );
hr=pMultiLanguage->ConvertString(&pdwMode,
COVS_0026,COVS_0030,(UCHAR*)m_setstr,&one,m_getstr,&two);
if( FAILED(hr))
{
goto error_data;
}
m_edt_after=m_getstr;
free( m_getstr );
UpdateData(FALSE);
error_data:
m_edt_before.ReleaseBuffer();
pMultiLanguage->Release();
CoUninitialize();}
          
 
 主要な部分は、赤字の部分である。
まず、CoCreateInstanceによって、IMultiLanguageのインスタンスを取得している。
次に、1つ目のpMultiLanguage->ConvertStringにより、取得先のバッファサイズを取得し、
2つ目のpMultiLanguage->ConvertStringにより、アロケートされた領域に変換文字列を格納。 上記操作により、SJIS文字からUNICODE文字への変換が行われる。
这是上次版主给我贴的代码,是从SJIS到UNICODE的内码转换
我的问题是:
1.#define COVS_0026 932
  #define COVS_0027 1200
  #define COVS_0028 1201
这些宏定义怎么知道对应的是哪个字符集
2。怎么实现JIS到SJIS的转换
如果还有别的方法更好,up有分!

解决方案 »

  1.   

    Code Value (Codepage) Alphabet 
    DIN_66003 20106 IA5 (German) 
    NS_4551-1 20108 IA5 (Norwegian) 
    SEN_850200_B 20107 IA5 (Swedish) 
    _autodetect 50932 Japanese (Auto Select) 
    _autodetect_kr 50949 Korean (Auto Select) 
    big5 950 Chinese Traditional (Big5) 
    csISO2022JP 50221 Japanese (JIS-Allow 1 byte Kana) 
    euc-kr 51949 Korean (EUC) 
    gb2312 936 Chinese Simplified (GB2312) 
    hz-gb-2312 52936 Chinese Simplified (HZ) 
    ibm852 852 Central European (DOS) 
    ibm866 866 Cyrillic Alphabet (DOS) 
    irv 20105 IA5 (IRV) 
    iso-2022-jp 50220 Japanese (JIS) 
    iso-2022-jp 50222 Japanese (JIS-Allow 1 byte Kana) 
    iso-2022-kr 50225 Korean (ISO) 
    iso-8859-1 1252 Western Alphabet 
    iso-8859-1 28591 Western Alphabet (ISO) 
    iso-8859-2 28592 Central European Alphabet (ISO) 
    iso-8859-3 28593 Latin 3 Alphabet (ISO) 
    iso-8859-4 28594 Baltic Alphabet (ISO) 
    iso-8859-5 28595 Cyrillic Alphabet (ISO) 
    iso-8859-6 28596 Arabic Alphabet (ISO) 
    iso-8859-7 28597 Greek Alphabet (ISO) 
    iso-8859-8 28598 Hebrew Alphabet (ISO) 
    koi8-r 20866 Cyrillic Alphabet (KOI8-R) 
    ks_c_5601 949 Korean 
    shift-jis 932 Japanese (Shift-JIS) 
    unicode 1200 Universal Alphabet 
    unicodeFEFF 1201 Universal Alphabet (Big-Endian) 
    utf-7 65000 Universal Alphabet (UTF-7) 
    utf-8 65001 Universal Alphabet (UTF-8) 
    windows-1250 1250 Central European Alphabet (Windows) 
    windows-1251 1251 Cyrillic Alphabet (Windows) 
    windows-1252 1252 Western Alphabet (Windows) 
    windows-1253 1253 Greek Alphabet (Windows) 
    windows-1254 1254 Turkish Alphabet 
    windows-1255 1255 Hebrew Alphabet (Windows) 
    windows-1256 1256 Arabic Alphabet (Windows) 
    windows-1257 1257 Baltic Alphabet (Windows) 
    windows-1258 1258 Vietnamese Alphabet (Windows) 
    windows-874 874 Thai (Windows) 
    x-euc 51932 Japanese (EUC) 
    x-user-defined 50000 User Defined 
      

  2.   

    // シフトJISからJISへの変換
    //------------------------------------------------------------
    // Japanese Shift-JIS to JIS code
    //
    //  return: Converted code
    //      0: not Shift-JIS code
    //
    //  note: user defined code (0xf040 - 0xfcfc) is unsupported.
    //------------------------------------------------------------
    unsigned short Sjis2Jis( unsigned short sjis )
    {
        unsigned short ubyte, lbyte;
        
        
        if (((sjis >= 0x8140) && (sjis <= 0x9ffc)) ||
            ((sjis >= 0xe040) && (sjis <= 0xeffc)) )
        {
            ubyte = sjis >> 8;
            lbyte = sjis & 0x00ff;
            
            if ( (lbyte <= 0x3f) || (lbyte == 0x7f) || 
                    (lbyte >= 0xfd) ) return 0;
            
            if ( ubyte >= 0xe0 ) ubyte -= 0xc0; else ubyte -= 0x80;
            ubyte = (ubyte << 1) + 0x1f;
            
            if ( lbyte >= 0x9f )
            {
                ubyte++;
                lbyte -= 0x7e;
            } else {
                if ( lbyte >= 0x80 ) lbyte--;
                lbyte -= 0x1f;
            }
            
            return ( ubyte << 8 ) + lbyte;
            
        } else {
            return 0;
        }
    }// JISからシフトJISへの変換
    //------------------------------------------------------------
    // Japanese JIS to Shift-JIS code
    //
    //    return: Converted code
    //    0: not JIS code
    //
    //  note: user defined code (0xf040 - 0xfcfc) is unsupported.
    //------------------------------------------------------------
    unsigned short Jis2Sjis( unsigned short jis )
    {
        unsigned short     ubyte, lbyte;
        
        
        ubyte = jis >> 8;
        lbyte = jis & 0x00ff;
        
        lbyte += 0x1f;
        if ( lbyte >= 0x7f ) lbyte++;
        if ( lbyte <= 0x3f ) return 0;
        
        if ( (ubyte & 0x0001) == 0 )
        {
            lbyte = jis & 0x00ff;
            lbyte += 0x7e;
            ubyte--;
            if ( lbyte > 0xfd ) return 0;
        }
        
        ubyte -= 0x1f;
        ubyte = ubyte >> 1;
        ubyte += 0x80;
        if ( ubyte >= 0xa0 ) ubyte += 0x40;
        
        if ( ((ubyte >= 0x81) && (ubyte <= 0x9f)) ||
                ((ubyte >= 0xe0) && (ubyte <= 0xef)) )
        {
            return (ubyte << 8) + lbyte;
        } else {
            return 0;
        }
    }例:(Sjis2Jis()関数が非漢字で0を返すことを利用して)
      テキスト内の文字数を漢字を考慮して数える
      (Macのパスカル文字列用です)//------------------------------------------------------------
    // String Length for Japanese.
    //
    //    return: Length
    //
    //  note: user defined code (0xf040 - 0xfcfc) is unsupported.
    //------------------------------------------------------------
    short StringCount( Str255 text )
    {
        short               i;
        short               count;
        unsigned short      sjis;
        
        count = 0;
        
        for ( i = 1; i <= text[0]; i++)
        {
            // 最後に1バイトが残った場合
            if ( i == text[0] ) { count++; break; }
            
            sjis = ( (unsigned short)text[i] << 8 ) +
                     (unsigned short)text[i+1];
            if ( Sjis2Jis( sjis ) ) i++;
            count++;
        }
        
        return count;
    }
      

  3.   

    多谢楼上的任兄。str255是什么类型,在vc下怎么用?可以举个例子吗,比如str1是jis的,如何得到sjis的str2
      

  4.   

    如果你安装了win2k或者更高版本,在区域选项的高级页面中可以看到代码页转换表
    更多信息可以参考
    http://msdn.microsoft.com/library/en-us/intl/unicode_81rn.asp
    http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset4.asp