📄 cmemory.cpp
字号:
cmemBuf.Append( (char*)uchDecode, iByteIndex );
}
}
delete [] pBuf;
}
nBgn = nPos;
while( nBgn < nSrcLen && ( pszSrc[nBgn] == CR || pszSrc[nBgn] == LF ) ){
nBgn++;
}
}
SetData( cmemBuf.GetPtr(), cmemBuf.m_nDataLen );
return;
}
/* Quoted-Printableデコード */
long CMemory::QuotedPrintable_Decode( char* pszSrc, long nSrcLen )
{
int i;
char* pszDes;
long lDesSize;
char szHex[3];
int nHex;
memset( szHex, 0, 3 );
pszDes = new char [nSrcLen + 1];
memset( pszDes, 0, nSrcLen + 1 );
lDesSize = 0;
for( i = 0; i < nSrcLen; i++ ){
if( pszSrc[i] == '=' ){
szHex[0] = pszSrc[i + 1];
szHex[1] = pszSrc[i + 2];
sscanf( szHex, "%x", &nHex );
pszDes[lDesSize] = (char)nHex;
lDesSize++;
i += 2;
}else{
pszDes[lDesSize] = pszSrc[i];
lDesSize++;
}
}
pszDes[lDesSize] = 0;
memcpy( (char *)pszSrc, (const char *)pszDes, lDesSize );
delete [] pszDes;
return lDesSize;
}
/* JIS→SJIS変換 */
long CMemory::MemJIStoSJIS( unsigned char* pszSrc, long nSrcLen )
{
int i, j;
char* pszDes;
unsigned short sCode;
pszDes = new char [nSrcLen + 1];
memset( pszDes, 0, nSrcLen + 1 );
j = 0;
for( i = 0; i < nSrcLen - 1; i++ ){
sCode = (unsigned short)_mbcjistojms(
(unsigned int)
(((unsigned short)pszSrc[i ] << 8) |
((unsigned short)pszSrc[i + 1]))
);
if( sCode != 0 ){
pszDes[j ] = (unsigned char)(sCode >> 8);
pszDes[j + 1] = (unsigned char)(sCode);
++i;
j+=2;
}else{
pszDes[j] = pszSrc[i];
j++;
}
}
pszDes[j] = 0;
memcpy( (char *)pszSrc, (const char *)pszDes, j );
delete [] pszDes;
return j;
}
/************************************************************************
*
*【関数名】
* EUCToSJIS
*
*【機能】
* 指定範囲のバッファ内にEUC漢字コード
* があればSJIS全角コードに変換する。 //Sept. 1, 2000 jepro 'シフト'を'S'に変更
* 半角文字は変換せずにそのまま残す。
*
* 制御文字CRLF以外のバイナリコードが混入している場合には結果が不定と
* なることがあるので注意。
* バッファの最後に漢字コードの1バイト目だけがあると困る
*
*【入力】 なし
*
*【戻り値】 なし
*
************************************************************************/
/* EUC→SJISコード変換 */
void CMemory::EUCToSJIS( void )
{
char* pBuf = m_pData;
int nBufLen = m_nDataLen;
int nPtr = 0L;
int nPtrDes = 0L;
char* pszDes = new char[nBufLen];
unsigned int sCode;
while( nPtr < nBufLen ){
if( (unsigned char)pBuf[nPtr] == (unsigned char)0x8e && nPtr < nBufLen - 1 ){
/* 半角カタカナ */
pszDes[nPtrDes] = pBuf[nPtr + 1];
nPtrDes++;
nPtr += 2;
}else
/* EUC漢字コードか? */
if( nPtr < nBufLen - 1 && IsEUCKan1(pBuf[nPtr]) && IsEUCKan2(pBuf[nPtr + 1L]) ){
/* 通常のJISコードに変換 */
pBuf[nPtr ] &= 0x7f;
pBuf[nPtr + 1L] &= 0x7f;
/* SJISコードに変換 */ //Sept. 1, 2000 jepro 'シフト'を'S'に変更
sCode = (unsigned short)_mbcjistojms(
(unsigned int)
(((unsigned short)pBuf[nPtr] << 8) |
((unsigned short)pBuf[nPtr + 1]))
);
if( sCode != 0 ){
pszDes[nPtrDes ] = (unsigned char)(sCode >> 8);
pszDes[nPtrDes + 1] = (unsigned char)(sCode);
nPtrDes += 2;;
nPtr += 2;
}else{
pszDes[nPtrDes] = pBuf[nPtr];
nPtrDes++;
nPtr++;
}
}else{
pszDes[nPtrDes] = pBuf[nPtr];
nPtrDes++;
nPtr++;
}
}
SetData( pszDes, nPtrDes );
delete [] pszDes;
return;
}
/* SJIS→EUCコード変換 */
void CMemory::SJISToEUC( void )
{
unsigned char* pBuf = (unsigned char*)m_pData;
int nBufLen = m_nDataLen;
int i;
int nCharChars;
unsigned char* pDes;
int nDesIdx;
unsigned short sCode;
pDes = new unsigned char[nBufLen * 2];
nDesIdx = 0;
for( i = 0; i < nBufLen; ++i ){
nCharChars = CMemory::MemCharNext( (const char *)pBuf, nBufLen, (const char *)&(pBuf[i]) ) - (const char*)&(pBuf[i]);
if( nCharChars == 1 ){
if( pBuf[i] >= (unsigned char)0x80 ){
/* 半角カタカナ */
pDes[nDesIdx ] = (unsigned char)0x8e;
pDes[nDesIdx + 1] = pBuf[i];
nDesIdx += 2;
}else{
pDes[nDesIdx] = pBuf[i];
nDesIdx++;
}
}else
if( nCharChars == 2 ){
/* 全角文字 */
// Oct. 3, 2002 genta IBM拡張文字対応
sCode = (unsigned short)_mbcjmstojis_ex( pBuf + i );
if(sCode != 0){
pDes[nDesIdx ] = (unsigned char)0x80 | (unsigned char)(sCode >> 8);
pDes[nDesIdx + 1] = (unsigned char)0x80 | (unsigned char)(sCode);
nDesIdx += 2;
++i;
}else{
pDes[nDesIdx ] = pBuf[i];
pDes[nDesIdx + 1] = pBuf[i + 1];
nDesIdx += 2;
++i;
}
}else
if( nCharChars > 0 ){
i += nCharChars - 1;
}
}
SetData( (const char *)pDes, nDesIdx );
delete [] pDes;
return;
}
/****
UTF-8のコード
ビット列 内容
0xxx xxxx 1バイトコード
10xx xxxx 2バイトコード、3バイトコードの2, 3文字目
110x xxxx 2バイトコードの先頭バイト
1110 xxxx 3バイトコードの先頭バイト
UTF-8のエンコーディング
フォーマット Unicode Unicodeビット列 UTFビット列 備考
1バイトコード \u0~\u7F 0000 0000 0aaa bbbb 0aaa bbbb
2バイトコード \u80~\u7FF 0000 0aaa bbbb cccc 110a aabb 10bb cccc
3バイトコード \u800~\uFFFF aaaa bbbb cccc dddd 1110 aaaa 10bb bbcc 10cc dddd
4バイトコード Surrogate 110110wwwwzzzzyy + 110111yyyyxxxxxx 1111 0uuu 10uu zzzz 10yy yyyy 10xx xxxx Javaでは未使用
***/
/* UTF-8の文字か */
int CMemory::IsUTF8( const unsigned char* pData, int nDataLen )
{
if( 3 <= nDataLen
&& (unsigned char)0xe0 == (unsigned char)(pData[0] & (unsigned char)0xf0)
&& (unsigned char)0x80 == (unsigned char)(pData[1] & (unsigned char)0xc0)
&& (unsigned char)0x80 == (unsigned char)(pData[2] & (unsigned char)0xc0)
){
return 3;
}
if( 2 <= nDataLen
&& (unsigned char)0xc0 == (unsigned char)(pData[0] & (unsigned char)0xe0)
&& (unsigned char)0x80 == (unsigned char)(pData[1] & (unsigned char)0xc0)
){
return 2;
}
// if( 1 <= nDataLen
// && (unsigned char)0 == (unsigned char)(pData[0] & (unsigned char)0x80)
// ){
// return 1;
// }
return 0;
}
int CMemory::DecodeUTF8toUnicode( const unsigned char* pData, int nUTF8Bytes, unsigned char* pDes )
{
switch( nUTF8Bytes ){
case 1:
pDes[1] = 0x00;
pDes[0] = pData[0];
return 2;
case 2:
pDes[1] = ( pData[0] & 0x1c ) >> 2;
pDes[0] = ( pData[0] << 6 ) | ( pData[1] & 0x3f );
return 2;
case 3:
pDes[1] = ( ( pData[0] & 0x0f ) << 4 )
| ( ( pData[1] & 0x3c ) >> 2 );
pDes[0] = ( pData[2] & 0x3f )
| ( ( pData[1] & 0x03 ) << 6 );
return 2;
}
return 0;
}
/* UTF-8→SJISコード変換 */
void CMemory::UTF8ToSJIS( void )
{
unsigned char* pBuf = (unsigned char*)m_pData;
int nBufLen = m_nDataLen;
int i;
int j;
// int nCharChars;
unsigned char* pDes;
int k;
// unsigned short sCode;
int nUTF8Bytes;
int nUNICODEBytes;
unsigned char pWork[100];
setlocale( LC_ALL, "Japanese" );
pDes = new unsigned char[nBufLen * 2];
k = 0;
for( i = 0; i < nBufLen; ){
/* UTF-8の文字か */
nUTF8Bytes = IsUTF8( &pBuf[i], nBufLen - i );
switch( nUTF8Bytes ){
case 1:
case 2:
case 3:
nUNICODEBytes = DecodeUTF8toUnicode( &pBuf[i], nUTF8Bytes, pWork );
// memcpy( &pDes[k], pWork, nUNICODEBytes );
// k += nUNICODEBytes;
if( 2 == nUNICODEBytes ){
j = wctomb( (char*)&(pDes[k]), ((wchar_t*)pWork)[0] );
if( -1 == j ){
memcpy( &pDes[k], &pBuf[i], nUTF8Bytes );
k += nUTF8Bytes;
}else{
k += j;
}
}else{
memcpy( &pDes[k], &pBuf[i], nUTF8Bytes );
k += nUTF8Bytes;
}
i += nUTF8Bytes;
break;
default:
pDes[k] = pBuf[i];
++i;
k++;
break;
}
}
SetData( (const char *)pDes, k );
delete [] pDes;
return;
}
/* コード変換 SJIS→UTF-8 */
void CMemory::SJISToUTF8( void )
{
/* コード変換 SJIS→Unicode */
SJISToUnicode();
/* コード変換 Unicode→UTF-8 */
UnicodeToUTF8();
return;
}
/* コード変換 SJIS→UTF-7 */
void CMemory::SJISToUTF7( void )
{
/* コード変換 SJIS→Unicode */
SJISToUnicode();
/* コード変換 Unicode→UTF-7 */
UnicodeToUTF7();
return;
}
/* コード変換 Unicode→UTF-8 */
void CMemory::UnicodeToUTF8( void )
{
wchar_t* pUniBuf = (wchar_t*)m_pData;
// char* pBuf = (char*)m_pData;
int nBufLen = m_nDataLen;
int i;
// int j;
// int nCharChars;
unsigned char* pWork;
unsigned char* pDes;
int k;
// unsigned short sCode;
// int nUTF8Bytes;
// int nUNICODEBytes;
// unsigned char pWork[100];
// unsigned char* pBufUTF8;
// wchar_t* pUniBuf;
setlocale( LC_ALL, "Japanese" );
k = 0;
for( i = 0; i < (int)(nBufLen / sizeof( wchar_t )); ++i ){
if( 0x0000 <= pUniBuf[i] && 0x007f >= pUniBuf[i] ){
k += 1;
}else
if( 0x0080 <= pUniBuf[i] && 0x07ff >= pUniBuf[i] ){
k += 2;
}else
if( 0x0800 <= pUniBuf[i] && 0xffff >= pUniBuf[i] ){
k += 3;
}
}
pDes = new unsigned char[k + 1];
memset( pDes, 0, k + 1 );
k = 0;
for( i = 0; i < (int)(nBufLen / sizeof( wchar_t )); ++i ){
pWork = (unsigned char*)&((pUniBuf[i]));
// pWork = (unsigned char*)pUniBuf;
// pWork += sizeof( wchar_t ) * i;
if( 0x0000 <= pUniBuf[i] && 0x007f >= pUniBuf[i] ){
pDes[k] = pWork[0];
k += 1;
}else
if( 0x0080 <= pUniBuf[i] && 0x07ff >= pUniBuf[i] ){
pDes[k] = ( ( pWork[0] & 0xc0 ) >> 6 )
| ( ( pWork[1] & 0x07 ) << 2 )
| 0xc0;
pDes[k + 1] = ( pWork[0] & 0x3f ) | 0x80;
k += 2;
}else
if( 0x0800 <= pUniBuf[i] && 0xffff >= pUniBuf[i] ){
pDes[k] = ( ( pWork[1] & 0xf0 ) >> 4 )
| 0xe0;
pDes[k + 1] = 0x80
| ( ( pWork[1] & 0x0f ) << 2 )
| ( ( pWork[0] & 0xc0 ) >> 6 );
pDes[k + 2] = 0x80
| ( pWork[0] & 0x3f );
k += 3;
}else{
}
}
SetData( (const char *)pDes, k );
delete [] pDes;
return;
}
/* コード変換 UTF-7→SJIS
UTF-7についてはRFC 2152参照.
*/
void CMemory::UTF7ToSJIS( void )
{
char* pBuf = (char*)m_pData;
int nBufLen = m_nDataLen;
int i;
char* pszWork;
int nWorkLen;
char* pDes;
int k;
BOOL bBASE64;
int nBgn;
// CMemory cmemWork;
CMemory* pcmemWork;
pcmemWork = new CMemory;
pDes = new char[nBufLen + 1];
setlocale( LC_ALL, "Japanese" );
k = 0;
bBASE64 = FALSE;
// 2002.10.05 Moca < を<= に変更 ただし,pBuf[nBufLen]は存在しないことに注意
for( i = 0; i <= nBufLen; ++i ){
if( !bBASE64 ){
if( i < nBufLen - 1
&& '+' == pBuf[i]
&& '-' == pBuf[i + 1]
){
pDes[k] = '+';
k++;
++i;
}else
if( i < nBufLen - 2
&& '+' == pBuf[i]
&& -1 != IsBASE64Char( pBuf[i + 1] ) /* 文字がBase64のデータか */
){
nBgn = i + 1;
bBASE64 = TRUE;
}else
if( i < nBufLen ){
pDes[k] = pBuf[i];
k++;
}
}else{
if( i == nBufLen || // 2002.10.25 Moca データ終端時もデコード
-1 == IsBASE64Char( pBuf[i] ) ){ // Oct. 10, 2000 genta
nWorkLen = i - nBgn;
BOOL bSuccess;
bSuccess = TRUE;
if( 3 <= nWorkLen ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -