基本的なインタフェースとしては、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有分!
以下に基本的なソースを示す。#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有分!
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
//------------------------------------------------------------
// 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;
}
更多信息可以参考
http://msdn.microsoft.com/library/en-us/intl/unicode_81rn.asp
http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset4.asp