真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

禁用字檢測(cè)-創(chuàng)新互聯(lián)

utf8編碼的數(shù)據(jù)可直接使用下面的代碼

創(chuàng)新互聯(lián)長(zhǎng)期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為云城企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站制作,云城網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

最關(guān)鍵的步驟就是把字符串拆成單個(gè)字,UTF-8編碼的字,如果只有一個(gè)字節(jié)則其最高二進(jìn)制位為0;如果是多字節(jié),其第一個(gè)字節(jié)從最高位開始,連續(xù)的二進(jìn)制位值為1的個(gè)數(shù)決定了其編碼的位數(shù),其余各字節(jié)均以10開頭。

UTF-8最多可用到6個(gè)字節(jié)。

1字節(jié) 0xxxxxxx

2字節(jié) 110xxxxx 10xxxxxx

3字節(jié) 1110xxxx 10xxxxxx 10xxxxxx

4字節(jié) 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

5字節(jié) 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

6字節(jié) 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

其它就很簡(jiǎn)單了

1、禁用字處理  禁用字拆分后以第一個(gè)為key保存

2、待測(cè)試字符串

  a)、拆分成單字

  b)、大寫轉(zhuǎn)小寫,字母和空格全角轉(zhuǎn)半角,去掉多余空格(英文字母后最多只會(huì)有一個(gè)空格,中文后不應(yīng)該有空格)

  c)、遍歷字符串的所有字 檢測(cè)每個(gè)字對(duì)應(yīng)的禁用字組是否在待測(cè)字符串中

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

class CDisableWord
{
struct SDisableWord
{
	std::string	str;
};
typedef std::vector 	 VDW;
private:
	std::map	m_mapDisableWord;
	std::set		m_setAllDisableWord;

    // 特殊轉(zhuǎn)換 
    std::map  m_mapSpecialWord;
private:
	// 把字符串拆分為單個(gè)字
	size_t SplitWord(const char* pSrc, unsigned int len, std::vector& output);
    // 獲取特殊字對(duì)應(yīng)的轉(zhuǎn)換字
    const std::string* GetSpecialWord(const std::string& str);
public:
    CDisableWord();

    // 設(shè)置禁用字
	void AddOneDisableWord(const std::string& str);

    // 檢測(cè)
	bool CheckStr(const char* pSrc, unsigned int len);
	bool CheckStr(const std::string& str);
};

CDisableWord::CDisableWord()
{
	std::string qjdx[26] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
	std::string qjxx[26] = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
	std::string dx = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	std::string rst = "abcdefghijklmnopqrstuvwxyz";

    std::string str1 = "a";
    std::string str2 = "a";
	for(int i = 0; i < 26; i++)
	{
        str1[0] = rst[i];
        str2[0] = dx[i];

		m_mapSpecialWord[qjdx[i]] = str1;
		m_mapSpecialWord[qjxx[i]] = str1;
		m_mapSpecialWord[str2] = str1;
	}

	m_mapSpecialWord[" "] = std::string(" ");
}

// 把字符串拆分為單個(gè)字
size_t CDisableWord::SplitWord(const char* pSrc, unsigned int len, std::vector& output)
{
    std::string ch;
    unsigned char byte;
    for(unsigned int i = 0, wlen = 0; i < len; i += wlen)
    {
        byte = (unsigned char)pSrc[i];
        if (byte >= 0xFC)
            wlen = 6;  
        else if (byte >= 0xF8)
            wlen = 5;
        else if (byte >= 0xF0)
            wlen = 4;
        else if (byte >= 0xE0)
            wlen = 3;
        else if (byte >= 0xC0)
            wlen = 2;
        else
            wlen = 1;

        if(i + wlen > len)
            break;

        ch.clear();
        for(unsigned int j = 0; j < wlen; j++)
            ch += pSrc[i+j];

        output.push_back(ch);
    }

    return output.size();
}

// 獲取特殊字對(duì)應(yīng)的轉(zhuǎn)換字
const std::string* CDisableWord::GetSpecialWord(const std::string& str)
{
    std::map::iterator miter = m_mapSpecialWord.find(str);
    if(miter == m_mapSpecialWord.end())
        return NULL;

    return &(miter->second);
}

void CDisableWord::AddOneDisableWord(const std::string& str)
{
    if(m_setAllDisableWord.find(str) != m_setAllDisableWord.end())
        return;

    std::vector output;
    if(SplitWord(str.c_str(), str.size(), output) == 0 || output[0].size() == 0)
        return;

    std::map::iterator miter = m_mapDisableWord.find(output[0]);
    if(miter == m_mapDisableWord.end())
    {
        m_mapDisableWord[output[0]] = VDW();
        miter = m_mapDisableWord.find(output[0]);
    }

    if(miter == m_mapDisableWord.end())
        return;

    SDisableWord sdw;
    sdw.str = str;
    miter->second.push_back(sdw);
}

bool CDisableWord::CheckStr(const char* pSrc, unsigned int len)
{
    if(len == 0)
        return true;

    std::string str(pSrc, len);
    return CheckStr(str);
}

bool CDisableWord::CheckStr(const std::string& str)
{
    if(str.size() == 0)
        return true;

    std::vector output;
    if(SplitWord(str.c_str(), str.size(), output) == 0 || output[0].size() == 0)
        return false;

    // 大寫轉(zhuǎn)小寫  全角轉(zhuǎn)半角
    for(size_t i = 0; i < output.size(); ++i)
    {
        const std::string* pStr = GetSpecialWord(output[i]);
        if(pStr)
            output[i] = *pStr;
    }


    std::string StrSrc = "";        //轉(zhuǎn)換之后的字符串
    std::string StrDelSpace = "";	//刪除非英文之后的所有空格 所有大寫轉(zhuǎn)成小寫

    std::set sonly;
    for(size_t i = 0; i < output.size(); ++i)
    {
        sonly.insert(output[i]);
        StrSrc += output[i];

        bool bnoadd = false;
        if(i > 0 && output[i] == " ")
        {
            bnoadd = true;
            for(int j = int(i - 1); j >= 0; --j)
            {
                if(output[j] == " ")
                    continue;

                if(output[j].size() > 1)
                    bnoadd = false;
                else if(j + 1 == int(i)) // 英文字符留一個(gè)空格
					bnoadd = false;

                break;
            }
        }

        if(!bnoadd)
       		StrDelSpace += output[i];
    }
    bool bSame = (StrDelSpace == StrSrc);

    std::set::iterator siter = sonly.begin();
    for(; siter != sonly.end(); ++siter)
    {
        std::map::iterator miter = m_mapDisableWord.find(*siter);
        if(miter == m_mapDisableWord.end())
            continue;

        for(size_t j = 0; j < miter->second.size(); ++j)
        {
            SDisableWord& sdw = miter->second[j];
            if(StrSrc.find(sdw.str) != std::string::npos)
                return false;
            else if(!bSame && StrDelSpace.find(sdw.str) != std::string::npos)
                return false;
        }
    }

    return true;
}

int main()
{
    CDisableWord cdw;

	// 設(shè)置禁用字
    std::string strdw[] = {"中文", "英文", "測(cè)試", "aabb", "測(cè) 試", "cc dd"};
    for(int i = 0; i < 6; i++)
        cdw.AddOneDisableWord(strdw[i]);

    while(1)
    {
        char s[51];
        std::cin.getline(s,50);

        if(cdw.CheckStr(s, strlen(s)))
            printf("收到:%s  沒有敏感字\n", s);
        else
            printf("收到:%s  敏感字 敏感字 敏感字\n", s);
    }

    return 0;
}

// g++ -g -o DisableWord DisableWord.cpp

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


文章名稱:禁用字檢測(cè)-創(chuàng)新互聯(lián)
標(biāo)題來源:http://weahome.cn/article/ceojji.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部