MFC에서 string 특수문자 제거

반응형
728x90
반응형
 
 
Introduction

문자들의 조합에는 다양한 특수문자들이 포함되어있습니다. 이러한 특수문자는 문서, 음악 등을 검색할 때 특히 취약한 부분입니다. 따라, 특수문자를 제거를 통해 검색의 효율을 올리는 방법을 알려드리고자 합니다. 검색에 대한 부분은 추후 정리할 예정이며, 이번 포스팅에서는 특수문자 제거하는 부분에 대해 살펴보도록 하겠습니다.  먼저, 특수문자는 어떻게 정의 되어있는지 알기위해 ASCII코드를 살펴보도록 하겠습니다.  Low level이라 하기는 그렇지만, 문자를 다루기 위해서는 아스키코드, 유니코드 등 문자들에 대해 꼭 알아둬야 합니다. 이 밖에 2벌식, 3벌식, 글자 조합 등과 관련된 내용들이 있지만 이 내용 또한 추후 정리 하도록 하겠습니다. 
 
특수문자

아스키 코드가 정리된 곳은 많이 있지만, 구글링을 통해 살펴본 위키백과에서 사진을 가지고왔습니다. 
이중에서 특수 문자의 범위가 눈에 보이시나요? 
 
특수 문자는 아스키코드 값에서 4개의 범위로 구성되어있습니다. 이에 대해, 다음과 같이 정리가능합니다.  16진수로 된 값을 사용하는 것이 추후 개발하는데 편리합니다. 
 
// range : '!' ~ '/'    char ch_start = 0x21;     char ch_end = 0x2f;
// range : ':' ~ '@'    char ch_start = 0x3a;     char ch_end = 0x40;
// range : '[' ~ '''    char ch_start = 0x5b;     char ch_end = 0x60;
// range : '{' ~ '~'    char ch_start = 0x7b;     char ch_end = 0x7e;
 
이제 string의 문자를 하나씩 검사하며, 글자를 제거하기만 하면 되겠죠?  아스키 코드가 궁금하신 분들은 나무위키, 위키백과를 살펴보시기 바랍니다. 
 
 
std:string 특수문자 제거: Part 1

이제 특수 문자 제거하는 방법을 알아볼까요?
 
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

int main2() {

    string str("L001_23:35:33:55");
    cout << str << endl;        // print: L001_23:35:33:55

    str.erase(4);
    cout << str << endl;        // print: L001

    str.erase(str.begin());     // 첫 글자 삭제
    //cout << str << endl;      // print: 001_234234

    str.erase(str.end() - 1);   // 마지막 글자 삭제
    cout << str << endl;        // print: L001_23423

    return 0;
}
 
예제에서 살펴보면, erase() 함수를 이용하면 될듯하네요...!!
이를 이용하여 다음 파트로 넘어가보도록 하겠습니다. 
 
 
std:string 특수문자 제거: Part 2

 
상단에 이와 같이 정리합니다. 
 
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
가장먼저 필요한 헤더파일을 추가합니다. 
 
std::string ReplaceAll(std::string& str, const std::string& from, const std::string& to) {
    size_t start_pos = 0; 
    while ((start_pos = str.find(from, start_pos)) != std::string::npos)
    {
        str.replace(start_pos, from.length(), to);
        start_pos += to.length();
    }
    return str;
}
 
그리고 글자를 제거하는 함수로 ReplaceAll()를 정의 합니다. 
 
string EliminateSpecialChar(string _iString, int _WordCount)
{
    // eliminate special char list
    for (int i = 0; i < (int)m_specialCharList.size(); i++) {
        ReplaceAll(_iString, m_specialCharList[i], std::string(" "));
    }

    // eliminate two space than word Count
    for (int i = 0; i < _WordCount; i++)
        ReplaceAll(_iString, std::string("  "), std::string(" "));

    return _iString;
}
 
그리고, m_specialCharList를 이용하여, 특수문자 제거를 수행합니다. 그리고, 두번째는 공백(2번, 1번) 을 제거하는 함수를 추가해두었습니다. 
이제 이 함수를 이용하여 특수문자를 삭제하는 코드를 살펴보도록 하겠습니다. 
 
#특수문자
 
typedef struct _specialchar {
        char start;
        char end;
        _specialchar(char _s, char _e) { start = _s; end = _e; }
    }ST_SPECIALCHAR;
 
특수 문자는 범위로 지정하는 것이 효율적일 것 같아, start, end를 이용하여 구성하였습니다. 
 
    vector<ST_SPECIALCHAR> vList; vList.clear();

    vList.push_back(ST_SPECIALCHAR(0x21, 0x2f));
    vList.push_back(ST_SPECIALCHAR(0x3a, 0x40));
    vList.push_back(ST_SPECIALCHAR(0x5b, 0x60));
    vList.push_back(ST_SPECIALCHAR(0x7b, 0x7e));
 
vector를 이용하여 특수문자의 범위를 추가합니다. 그리고 특수문자의 범위를 단일 vector로 구성하기위해 다음 코드를 추가합니다. 
 
// 전역으로 설정
vector<string> m_specialCharList;
 
상위 코드는 전역으로 설정합니다. 
 
    m_specialCharList.clear();
    for (int i = 0; i < (int)vList.size(); i++) {
        char _start = vList[i].start;
        char _end = vList[i].end;

        for (char _ch = _start; _ch <= _end; _ch++) {
            string _str; _str = _ch;
            m_specialCharList.push_back(_str);
        }
    }
 
이제 특수 문자는 m_specialCharList로 추가되었습니다. 이제 특수문자 제거하는 예시를 살펴보도록 하겠습니다. 
 
참고: 대문자/소문자 변경하기
 
std::transform(a.begin(), a.end(), a.begin(), toupper);    // a를 대문자로 변경
std::transform(a.begin(), a.end(), a.begin(), tolower);    // a를 소문자로 변경
 
예시: 특수문자 제거
 
string _nameA = "[music]존버'-(feat. Coogie, Jiselle)_MC몽_CHANNEL 8";    
std::transform(_nameA.begin(), _nameA.end(), _nameA.begin(), toupper); // 대문자
int tempWordCount = 10;
string outputA = EliminateSpecialChar(_nameA, tempWordCount);

cout << _nameA << endl << endl; 
cout << outputA << endl;        
 
출력결과
 
[MUSIC]존버'-(FEAT. COOGIE, JISELLE)_MC몽_CHANNEL 8
MUSIC 존버 FEAT COOGIE JISELLE MC몽 CHANNEL 8
 
엄청 간단하죠? ^^
728x90
반응형

댓글

Designed by JB FACTORY