본문

Qt에서 랜덤하게 문자열 생성하기, 한글 사용하기

테스트 케이스 생성을 위하여 RandomString이라는 유틸리티 클래스를 만들었다. 한글이름 생성은 "외국인 한국 이름 만들기 대박이다 ㅋㅋ 외국인 한국 이름 만들기.txt" 페이지에 있는 내용을 기반으로 작성하였고(꽤 그럴싸 하다) 문자열 생성은 "How do I create a random alpha-numeric string in C++?" 페이지에서 가져왔다. UUID는 혹시 나중에라도 쓸지 몰라 넣어놓은 것이다(uniqueness를 위해) 

 

이것을 올려놓은 이유는 물론 랜덤하게 문자열을 생성하는 방법을 기억하기 위함도 있겠지만 Qt에서의 한글처리의 기본적인 사항을 적어놓기 위해서이기도 하다. 우선 QTextCodec::codecForName("eucKR")->toUnicode 이것은 이미 다른 유틸리티 클래스에서 static으로 유용하게 사용하는 함수이다. QString은 기본적으로 유니코드형으로 저장이 되기 떄문에 이렇게 바꿔줘야 한글이 지원되며, 또한 참고로 UI에서 한글을 쓰고자 한다면 tr()을 사용하여 처리한다. tr()에 대한 자세한 사항은 "Forgot a tr()?" 페이지를 참고한다.

 

또한 c++ 에서 기본적으로 제공되는 rand()는 Qt에서 qrand()로 발전하였으며 차이점은 별로 없고 스레딩에 강한 장점을 가지고 있다. 그리고 Qt에서는 substr()이 없기 때문에 이 대신 mid(start, length)를 사용해서 문자열을 잘라낼 수 있다. 막상 써보니 쓸 내용이 없다... 그래서 적어본다, 대한민국의 인구순 성씨! '남궁'을 제외한 국내에서 많이 쓰이는 99가지 한글자로 이루어진 성씨이며 전체 목록은 위키피디아의 "대한민국의 인구순 성씨 페이지"에서 찾아볼 수 있다.


"김이박최정강조윤장임오한신서권황안송류홍전고문손양배조백허남심유노하전정곽성차유구우주임나신민진지엄원채강천양공현방변함노염여추변도석신소선주설방마정길위연표명기금왕반옥육진인맹제탁모여장어유국은편"

 

* RandomString.h

#ifndef RANDOMSTRING_H
#define RANDOMSTRING_H

#include <QTextCodec>
#include <QTime>
#include <QUuid>

class RandomString {
public:
    RandomString();
    QString getKoreanName();
    QString getNumber(int length);
    QString getString(int length);
    QString getUuid(int length);
};

#endif // RANDOMSTRING_H
 

* RandomString.cpp

#include "randomstring.h"

RandomString::RandomString() {
    QTime time = QTime::currentTime();
    qsrand((uint)time.msec());
}

QString RandomString::getKoreanName() {
    QString first=QTextCodec::codecForName("eucKR")->toUnicode("박김신최송강한이성정");
    QString second=QTextCodec::codecForName("eucKR")->toUnicode("용지제혜동상하효수은현래");
    QString third=QTextCodec::codecForName("eucKR")->toUnicode("화우준희교경욱진재훈라빈선리수임아애늘문인미기상병석건유섭원");

    QString result;
    result.append(first.at(qrand()%first.count()));
    result.append(second.at(qrand()%second.count()));
    result.append(third.at(qrand()%third.count()));
    return result;
}

QString RandomString::getNumber(int length) {
    QString result;
    for(int i=0; i<length; ++i) {
        result.append(QString::number(qrand()%10));
    }
    return result;
}

QString RandomString::getString(int length){
    static const char alphanum[] =
            "0123456789"
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            "abcdefghijklmnopqrstuvwxyz";
    QString result;
    for(int i=0; i<length; ++i) {
        result.append(alphanum[qrand() % (sizeof(alphanum) - 1)]);
    }
    return result;
}

QString RandomString::getUuid(int length) {
    return QUuid::createUuid().toString().replace('-',"").mid(1, length);
}


댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.