📄 cmemory.cpp
字号:
}
/* コード変換 SJIS→Unicode */
void CMemory::SJISToUnicode( void )
{
char* pBufUnicode;
int nBufUnicodeLen;
nBufUnicodeLen = CMemory::MemSJISToUnicode( &pBufUnicode, m_pData, m_nDataLen );
SetData( pBufUnicode, nBufUnicodeLen );
delete [] pBufUnicode;
return;
}
/* コード変換 SJIS→UnicodeBE */
void CMemory::SJISToUnicodeBE( void )
{
char* pBufUnicode;
int nBufUnicodeLen;
nBufUnicodeLen = CMemory::MemSJISToUnicode( &pBufUnicode, m_pData, m_nDataLen );
SetData( pBufUnicode, nBufUnicodeLen );
delete [] pBufUnicode;
SwapHLByte();
return;
}
/* コード変換 Unicode→SJIS */
void CMemory::UnicodeToSJIS( void )
{
char* pBufUnicode;
int nBufUnicodeLen;
unsigned char* pBuf;
pBuf = (unsigned char*)m_pData;
// BOMの削除はここではしないように変更
// 呼び出し側で対処してください 2002/08/30 Moca
nBufUnicodeLen = CMemory::MemUnicodeToSJIS( &pBufUnicode, m_pData, m_nDataLen );
SetData( pBufUnicode, nBufUnicodeLen );
delete [] pBufUnicode;
return;
}
/* コード変換 UnicodeBE→SJIS */
void CMemory::UnicodeBEToSJIS( void ){
SwapHLByte();
UnicodeToSJIS();
return;
}
/* ASCII&SJIS文字列をUnicodeに変換 */
int CMemory::MemSJISToUnicode( char** ppBufUnicode, const char*pBuf, int nBufLen )
{
int i, j, k;
wchar_t wchar;
char* pBufUnicode;
int nCharChars;
setlocale( LC_ALL, "Japanese" );
i = 0;
k = 0;
nCharChars = CMemory::MemCharNext( pBuf, nBufLen, &pBuf[i] ) - &pBuf[i];
while( nCharChars > 0 && i < nBufLen ){
i += nCharChars;
k += 2;
nCharChars = CMemory::MemCharNext( pBuf, nBufLen, &pBuf[i] ) - &pBuf[i];
}
pBufUnicode = new char[k + 1];
i = 0;
k = 0;
nCharChars = CMemory::MemCharNext( pBuf, nBufLen, &pBuf[i] ) - &pBuf[i];
while( nCharChars > 0 && i < nBufLen ){
j = mbtowc( &wchar, &pBuf[i], nCharChars );
if( j == -1 || j == 0 ){
pBufUnicode[k] = 0;
pBufUnicode[k + 1] = pBuf[i];
++i;
}else{
#if _DEBUG
if( j != 2 ){
MYTRACE( "%dバイトのUnicode文字に変換された SJIS(?)=%x %x\n", j,pBuf[i],((nCharChars >= 2)?(pBuf[i + 1]):0) );
}
#endif
*((wchar_t*)&(pBufUnicode[k])) = wchar;
i += j;
}
k += 2;
nCharChars = CMemory::MemCharNext( pBuf, nBufLen, &pBuf[i] ) - &pBuf[i];
}
*ppBufUnicode = pBufUnicode;
return k;
}
/* Unicode文字列をASCII&SJISに変換 */
int CMemory::MemUnicodeToSJIS( char** ppBufSJIS, const char*pBuf, int nBufLen )
{
int i, j, k;;
char* pBufSJIS;
wchar_t* pUniBuf;
char mbchar[4];
setlocale( LC_ALL, "Japanese" );
pUniBuf = (wchar_t*)pBuf;
i = 0;
k = 0;
for( i = 0; i < nBufLen / (int)sizeof( wchar_t ); ++i ){
j = wctomb( (char*)mbchar, pUniBuf[i] );
if( -1 == j ){
k += sizeof( wchar_t );
}else{
k += j;
}
}
pBufSJIS = new char[k];
k = 0;
for( i = 0; i < nBufLen / (int)sizeof( wchar_t ); ++i ){
j = wctomb( (char*)&(pBufSJIS[k]), pUniBuf[i] );
if( -1 == j ){
memcpy( &pBufSJIS[k], &pUniBuf[i], sizeof( wchar_t ) );
k += sizeof( wchar_t );
}else{
k += j;
}
}
*ppBufSJIS = pBufSJIS;
return k;
}
/* 文字列置換 */
void CMemory::Replace( char* pszFrom, char* pszTo )
{
CMemory cmemWork;
int nFromLen = strlen( pszFrom );
int nToLen = strlen( pszTo );
int nBgnOld = 0;
int nBgn = 0;
while( nBgn <= m_nDataLen - nFromLen ){
if( 0 == memcmp( &m_pData[nBgn], pszFrom, nFromLen ) ){
if( 0 < nBgn - nBgnOld ){
cmemWork.Append( &m_pData[nBgnOld], nBgn - nBgnOld );
}
cmemWork.Append( pszTo, nToLen );
nBgn = nBgn + nFromLen;
nBgnOld = nBgn;
}else{
nBgn++;
}
}
if( 0 < m_nDataLen - nBgnOld ){
cmemWork.Append( &m_pData[nBgnOld], m_nDataLen - nBgnOld );
}
SetData( &cmemWork );
return;
}
/* 文字列置換(日本語考慮版) */
void CMemory::Replace_j( char* pszFrom, char* pszTo )
{
CMemory cmemWork;
int nFromLen = strlen( pszFrom );
int nToLen = strlen( pszTo );
int nBgnOld = 0;
int nBgn = 0;
while( nBgn <= m_nDataLen - nFromLen ){
if( 0 == memcmp( &m_pData[nBgn], pszFrom, nFromLen ) ){
if( 0 < nBgn - nBgnOld ){
cmemWork.Append( &m_pData[nBgnOld], nBgn - nBgnOld );
}
cmemWork.Append( pszTo, nToLen );
nBgn = nBgn + nFromLen;
nBgnOld = nBgn;
}else{
if( _IS_SJIS_1( (unsigned char)m_pData[nBgn] ) ) nBgn++;
nBgn++;
}
}
if( 0 < m_nDataLen - nBgnOld ){
cmemWork.Append( &m_pData[nBgnOld], m_nDataLen - nBgnOld );
}
SetData( &cmemWork );
return;
}
/* 等しい内容か */
int CMemory::IsEqual( CMemory& cmem1, CMemory& cmem2 )
{
char* psz1;
char* psz2;
int nLen1;
int nLen2;
psz1 = cmem1.GetPtr( &nLen1 );
psz2 = cmem2.GetPtr( &nLen2 );
if( nLen1 == nLen2 ){
if( 0 == memcmp( psz1, psz2, nLen1 ) ){
return TRUE;
}
}
return FALSE;
}
/* 半角→全角 */
void CMemory::ToZenkaku(
int bHiragana, /* 1== ひらがな 0==カタカナ //2==英数専用 2001/07/30 Misaka 追加 */
int bHanKataOnly /* 1== 半角カタカナにのみ作用する*/
)
{
unsigned char* pBuf = (unsigned char*)m_pData;
int nBufLen = m_nDataLen;
int i;
int nCharChars;
// unsigned char uc;
unsigned short usSrc;
unsigned short usDes;
unsigned char* pBufDes;
int nBufDesLen;
static unsigned char* pszHanKataSet = (unsigned char*)"???????????????????????????????????????????????????????????????";
static unsigned char* pszDakuSet = (unsigned char*)"????????????????????";
static unsigned char* pszYouSet = (unsigned char*)"?????";
BOOL bHenkanOK;
pBufDes = new unsigned char[nBufLen * 2 + 1];
if( NULL == pBufDes ){
return;
}
nBufDesLen = 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){
bHenkanOK = FALSE;
if( bHanKataOnly ){ /* 1== 半角カタカナにのみ作用する */
if( NULL != strchr( (const char *)pszHanKataSet, pBuf[i] ) ){
bHenkanOK = TRUE;
}
}else{
//! 英数変換用に新たな条件を付加 2001/07/30 Misaka
if( ( (unsigned char)0x20 <= pBuf[i] && pBuf[i] <= (unsigned char)0x7E ) ||
( bHiragana != 2 && (unsigned char)0xA1 <= pBuf[i] && pBuf[i] <= (unsigned char)0xDF )
){
bHenkanOK = TRUE;
}
}
if( bHenkanOK ){
usSrc = pBuf[i];
if( FALSE == bHiragana &&
pBuf[i] == (unsigned char)'?' &&
pBuf[i + 1] == (unsigned char)'?' &&
bHiragana != 2
){
usDes = (unsigned short)0x8394; /* ヴ */
nCharChars = 2;
}else {
usDes = _mbbtombc( usSrc );
/* 濁音 */
if( bHiragana != 2 && pBuf[i + 1] == (unsigned char)'?' && NULL != strchr( (const char *)pszDakuSet, pBuf[i] ) ){
usDes++;
nCharChars = 2;
}
/* 拗音 */
//! 英数変換用に新たな条件を付加 2001/07/30 Misaka
//! bHiragana != 2 //英数変換フラグがオンではない場合
if( bHiragana != 2 && pBuf[i + 1] == (unsigned char)'?' && NULL != strchr( (const char *)pszYouSet, pBuf[i] ) ){
usDes += 2;
nCharChars = 2;
}
}
if( bHiragana == 1 ){
/* ひらがなに変換可能なカタカナならば、ひらがなに変換する */
if( (unsigned short)0x8340 <= usDes && usDes <= (unsigned short)0x837e ){ /* ァ~ミ */
usDes-= (unsigned short)0x00a1;
}else
if( (unsigned short)0x8380 <= usDes && usDes <= (unsigned short)0x8393 ){ /* ム~ン */
usDes-= (unsigned short)0x00a2;
}
}
pBufDes[nBufDesLen] = ( usDes & 0xff00 ) >> 8;
pBufDes[nBufDesLen + 1] = ( usDes & 0x00ff );
nBufDesLen += 2;
}else{
memcpy( &pBufDes[nBufDesLen], &pBuf[i], nCharChars );
nBufDesLen += nCharChars;
}
}else
if( nCharChars == 2 ){
usDes = usSrc = pBuf[i + 1] | ( pBuf[i] << 8 );
if( bHanKataOnly == 0 ){
if( bHiragana == 1 ){//英数変換を付加したために数値で指定した 2001/07/30 Misaka
/* 全角ひらがなに変換可能な全角カタカナならば、ひらがなに変換する */
if( (unsigned short)0x8340 <= usSrc && usSrc <= (unsigned short)0x837e ){ /* ァ~ミ */
usDes = usSrc - (unsigned short)0x00a1;
}else
if( (unsigned short)0x8380 <= usSrc && usSrc <= (unsigned short)0x8393 ){ /* ム~ン */
usDes = usSrc - (unsigned short)0x00a2;
}
}else if( bHiragana == 0 ){//英数変換を付加したために数値で指定した 2001/07/30 Misaka
/* 全角カタカナに変換可能な全角ひらがなならば、カタカナに変換する */
if( (unsigned short)0x829f <= usSrc && usSrc <= (unsigned short)0x82dd ){ /* ぁ~み */
usDes = usSrc + (unsigned short)0x00a1;
}else
if( (unsigned short)0x82de <= usSrc && usSrc <= (unsigned short)0x82f1 ){ /* む~ん */
usDes = usSrc + (unsigned short)0x00a2;
}
}
}
pBufDes[nBufDesLen] = ( usDes & 0xff00 ) >> 8;
pBufDes[nBufDesLen + 1] = ( usDes & 0x00ff );
nBufDesLen += 2;
}else{
memcpy( &pBufDes[nBufDesLen], &pBuf[i], nCharChars );
nBufDesLen += nCharChars;
}
if( nCharChars > 0 ){
i += nCharChars - 1;
}
}
pBufDes[nBufDesLen] = '\0';
SetData( (const char *)pBufDes, nBufDesLen );
delete [] pBufDes;
return;
}
/*! 全角→半角
nMode
0x01 カタカナに影響アリ
0x02 ひらがなに影響アリ
0x04 英数字に影響アリ
*/
#define TO_KATAKANA 0x01
#define TO_HIRAGANA 0x02
#define TO_EISU 0x04
void CMemory::ToHankaku(
int nMode /* 0==カタカナ 1== ひらがな 2==英数専用 */
)
{
static unsigned char* pszZenDAKU = (unsigned char*)"がぎぐげござじずぜぞだぢづでどばびぶべぼガギグゲゴザジズゼゾダヂヅデドバビブベボヴ";
static unsigned char* pszZenYOU = (unsigned char*)"ぱぴぷぺぽパピプペポ";
/* 入力 */
unsigned char* pBuf = (unsigned char*)m_pData;
int nBufLen = m_nDataLen;
unsigned int uiSrc;
/* 出力 */
unsigned char* pBufDes = new unsigned char[nBufLen + 1];
int nBufDesLen = 0;
unsigned int uiDes;
if( NULL == pBufDes ){
return;
}
/* 作業用 */
int nCharChars;
unsigned char pszZen[3]; // 全角文字用バッファ
int i;
BOOL bHenkanOK;
bool bInHiraKata = false; // 前の文字がカタカナorひらがなだったなら、trueとし、長音、濁点、半濁点を半角へ変換可能とする
for( i = 0; i < nBufLen; ++i ){
nCharChars = CMemory::MemCharNext( (const char *)pBuf, nBufLen, (const char *)&(pBuf[i]) ) - (const char*)&(pBuf[i]);
if( nCharChars == 2 ){
uiSrc = pBuf[i + 1] | ( pBuf[i] << 8 );
bHenkanOK = FALSE;
if( nMode == 0x00 ){ // どんな文字もokモード
bHenkanOK = TRUE;
}
if( nMode & TO_KATAKANA ){ /* カタカナに作用する */
if( 0x8340 <= uiSrc && uiSrc <= 0x8396 ){
bHenkanOK = TRUE;
bInHiraKata = true;
} else {
// 2003-04-30 かろと 長音がが変換できなかったのを修正
// 但し、ひらがな?カタカナの区別がない文字なので直前の文字で決定する
if( bInHiraKata == true ) {
// 長音"ー"(0x815b)?濁点(0x814a)?半濁点(0x814b)
if( uiSrc == 0x815b || uiSrc == 0x814a || uiSrc == 0x814b ) {
bHenkanOK = TRUE;
} else {
bInHiraKata = false;
}
}
}
}
if( nMode & TO_HIRAGANA ){ /* ひらがなに作用する */
if( 0x829F <= uiSrc && uiSrc <= 0x82F1 ){
bHenkanOK = TRUE;
bInHiraKata = true;
} else {
// 2003-04-30 かろと 長音がが変換できなかったのを修正
// 但し、ひらがな?カタカナの区別がない文字なので直前の文字で決定する
if( bInHiraKata == true ) {
// 長音"ー"(0x815b)?濁点(0x814a)?半濁点(0x814b)
if( uiSrc == 0x815b || uiSrc == 0x814a || uiSrc == 0x814b ) {
bHenkanOK = TRUE;
} else {
bInHiraKata = false;
}
}
}
}
if ( nMode & TO_EISU ){ /* 英数に作用する */
if( 0x824F <= uiSrc && uiSrc <= 0x8258){ // 数字
bHenkanOK = TRUE;
}
else if( 0x8260 <= uiSrc && uiSrc <= 0x8279){ // 英大文字
bHenkanOK = TRUE;
}
else if( 0x8281 <= uiSrc && uiSrc <= 0x829A){ // 英大文字
bHenkanOK = TRUE;
}
}
if (bHenkanOK == TRUE){
uiDes = _mbctombb( uiSrc );
if( uiDes == uiSrc ){ // 変換不可能
memcpy( &pBufDes[nBufDesLen], &pBuf[i], nCharChars );
nBufDesLen += nCharChars;
}else{
pBufDes[nBufDesLen] = (unsigned char)uiDes;
nBufDesLen++;
memcpy( pszZen, &pBuf[i], 2 );
pszZen[2] = '\0';
/* 濁音探し */
if( NULL != strstr( (const char *)pszZenDAKU, (const char *)pszZen ) ){
pBufDes[nBufDesLen] = (unsigned char)'?';
nBufDesLen++;
}else
/* 拗音探し */
if( NULL != strstr( (const char *)pszZenYOU, (const char *)pszZen ) ){
pBufDes[nBufDesLen] = (unsigned char)'?';
nBufDesLen++;
}
}
}
else {
memcpy( &pBufDes[nBufDesLen], &pBuf[i], nCharChars );
nBufDesLen += nCharChars;
}
}else{
memcpy( &pBufDes[nBufDesLen], &pBuf[i], nCharChars );
nBufDesLen += nCharChars;
}
if( nCharChars > 0 ){
i += nCharChars - 1;
}
}
pBufDes[nBufDesLen] = '\0';
SetData( (const c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -