⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsbc.cpp

📁 全角和半角字符之间的转换源码。目前只实现单个字符的判断和转换
💻 CPP
字号:

/***************************************************************************
Copyright @ 2006-2010, 高德软件有限公司
All Rights Reserved.

设计:CanJian(yangguojian@autonavi.com)
功能:1, 判断输入字符状态(半角(DBC case)    - false
						  还是全角(SBC case)- true)
      2, 半角=>全角 (DBC=>SBC)
	  3, 全角=>半角 (SBC=>DBC)
版本:AutoNavi20060407
备注:非MFC方式实现判断/转换;
      内存的释放(4-10)方式;
****************************************************************************/

#include "stdafx.h"
#include <iostream>
using namespace std;


bool   IsSBC(const char *pszWord);
char*  SBCToDBC(const char *pszWord);
char*  DBCToSBC(const char *pszWord);


int main(int argc, char* argv[])
{


    // 测试获取字符的内码:高低字节
    // 内码就是 该字符在该机器上的字符编码


    // 方式一:
    char cWord[] = "中" ;
    printf("%s: 0x%02X, 0x%02X\n",cWord, (unsigned char)(cWord[0]), (unsigned char)(cWord[1]));
    printf("%s: %d, %d\n", cWord, (unsigned char)(cWord[0]), (unsigned char)(cWord[1]));

    // 方式二:
    unsigned char pByte1[] = "X" ;
    printf("0x%02X, 0x%02X\n", pByte1[0], pByte1[1]);
    printf("%d, %d\n", pByte1[0], pByte1[1]);
    

	cout << endl << "-----IsDBC--Or--IsSBC-----" << endl;

	bool bResult = IsSBC("国");
	if (bResult)
    	cout << "全角" << endl;
	else
    	cout << "半角" << endl;


	char *ss = SBCToDBC("7");
	cout << ss ; 
	cout << "111" << endl;

	const char *s = "国" ;
    cout << s << endl;
	int nLen = strlen(s);
	char *ps = new char[nLen+1];
	char *pBck = ps;
	ps = DBCToSBC(s);
	cout << ps << endl;
	delete []pBck;

	return 0;
}


/**************************************************
功能: 判断是否为全角(SBC),是返回true
/*************************************************/
bool  IsSBC(const char *pszWord)
{
	int nLen = strlen(pszWord);

	for (int i=0; i<nLen; i++)
    {

        // 汉字(全角)第一字节总是大于163
    	if ((unsigned char)pszWord[i] > 163)
        {
        	return true;
        }

        // 全角字符的第一个字节(右往左)总是为163
    	else if ((unsigned char)pszWord[i] == 163)
        {
        	return true;
        }

        // 全角空格高低字节都是161(空格特例)
    	else if (((unsigned char)pszWord[i]==161) &&
            ((unsigned char)pszWord[i+1])==161)
        {
        	return true;
        }

        // 半角字符
    	else if ((unsigned char)pszWord[i] < 163)
        	return false;

    }

	return false;
}


/**************************************************
功能: 全角字符=>半角字符
备注: 1, 当为汉字全角字符时,直接返回(无需转换)
       2, 只对非汉字类全角字符进行转换
	   3, 当为空格时,固定转换
/*************************************************/ 
char*  SBCToDBC(const char *pszWord)
{
	int nLen = strlen(pszWord);
	char *pszDBC = new char[nLen+1];
    //char *pBck = pszDBC;
	strcpy(pszDBC, pszWord);

    // 如果是全角字符
	bool isSBC = false;    // 是否为全角
	if ((unsigned char)pszWord[0] > 163)
    	return pszDBC;

	isSBC = IsSBC(pszWord);
	if (isSBC)
    {
    	int CodeDBC = (unsigned char)pszWord[1];

        // 空格全角字符固定为161(特例)
    	if (CodeDBC==161)
        	CodeDBC = 32;
    	else
        	CodeDBC -= 128;

        //*pszDBC = (unsigned char)CodeDBC;   // 方式一
		pszDBC[0] = (unsigned char)CodeDBC;   // 方式二
		pszDBC[1] = '\0';   // 追加结束标志
    }

    //delete [] pBck;
    //pszDBC = pBck = NULL;

	return pszDBC;
}

/**************************************************
功能: 将半角字符转换为全角字符
/*************************************************/ 
char*  DBCToSBC(const char *pszWord)
{
	int nLen = strlen(pszWord);
	char *pszSBC = new char[nLen+1];
	strcpy(pszSBC, pszWord);

	char SBC[3] = {0};
	bool isDBC = IsSBC(pszWord);

	if (!isDBC)    // 字符是半角
    {
    	int hightByte = (unsigned char)pszWord[0];
    	if (hightByte == 32)
        {            
        	SBC[0] = (char)161;
        	SBC[1] = (char)161;
        	SBC[3] = 0 ;
        }
    	else
        {
        	hightByte += 128;
        	SBC[0] = (char)163;
        	SBC[1] = (char)hightByte ;
        	SBC[3] = 0 ;
        }
    	strcpy(pszSBC, SBC);
    }

    //delete []pszSBC;
	return pszSBC;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -