오늘의 학습 키워드

string.PadRight(int num, char character), Encoding.Unicode.GetByteCount(string str)

 

공부한 내용

문제 : 오늘은 인벤토리 구현 중에 문제를 맞닥뜨렸다. 그것은 아이템 목록을 정렬하는 것인데 여러 아이템을 정렬된 상태로 출력 하는 것이었다.

시도한 것 1 : 처음엔 그냥 저번에 배웠듯이 PadRight를 사용하기로 했다. 하지만 아래에 나와있듯이 자꾸 무쇠 갑옷이 삐져나오는 문제가 생겼다.

찾아본 원인 : C#에서는 한글과 다른 문자들의 바이트 크기가 달라서 생기는 문제라는 것이다. (한글 2바이트, 다른 것 1바이트)

또 다른 문제 : 하지만 생각했던 대로 바이트 개수가 나오지 않았다. (한글 3바이트, 다른 것 1바이트)

원인 : 이는 Encoding.Default가 UTF-8로 잡혀있어서 한글은 3바이트로 나오던 것이다.

시도한 것 2 : 그래서 Encoding.Unicode로 지정했더니 모든 문자가 2바이트로 나오게 되었다.

마지막 문제 : 한글이 2문자를 차지하니 한글과 공백을 구분하는 로직이 필요하다.

시도한 것 3 : 한글을 EncodingDefault.GetByteCount == 3인지 검사해 개수를 세고 -1한 값을 패딩을 줄 전체 바이트 길이에서 빼줬다. (한글이 2글자 공백이 1글자를 차지하므로 공백일 시 패딩을 1개씩 늘림)

string ArrangeInfo(string str, int totalLength, char padChar = ' ')
{
    // 한글 2바이트
    int krByteLength = totalLength;
    int byteCount = Encoding.Unicode.GetByteCount(str);
    int krCount = 0;

    string[] strArr = str.Split();

    foreach (var c in str)
    {
        // 한글이면 count++;
        if (Encoding.Default.GetByteCount(c.ToString()) == 3)
        {
            krCount++;
        }
    }

    // 정렬이 안 되는 문제 발생
    // 2바이트니 / 2 할 때 한글의 개수가 홀수면 1 짝수면 2씩 감소시키기
    // 12
    //byteCount = krCount * 2;

    // 공백, 영어, 숫자 1바이트
    // 한글은 2바이트 크기는 2배
    // 한글 10글자 기준 30바이트
    // 한글 4개 12바이트
    // 8 8 10 10 14
    //int bytes = Encoding.Unicode.GetByteCount("무쇠갑옷");
    //int bytes1 = Encoding.Unicode.GetByteCount("낡은 검");
    //int bytes2 = Encoding.Unicode.GetByteCount("린넨 셔츠");
    //int bytes3 = Encoding.Unicode.GetByteCount("나무 망치");
    //int bytes4 = Encoding.Unicode.GetByteCount("스파르타의 창");

    // * 조심 : Default시 UTF-8로 잡혀서 3바이트로 나옴 
    // int bytes = Encoding.Default.GetByteCount("무쇠갑옷");
    string tempStr = str.PadRight(totalLength + totalLength - krCount, padChar);

    return tempStr;
}

 

 

오늘의 회고

 오늘은 인벤토리와 장착 기능 구현을 마무리 했다. 추가적으로 구현할 기능들이 여럿 보이지만 일단 선택 구현 사항부터 마무리 지으려고 한다. 오늘은 문자열 정렬 쪽에서 시간을 많이 뺏긴 것 같은데 그만큼 내가 모르고 있었다는 것이니까 다음 번에는 틀리지 않도록 다시 공부해봐야겠다.

 내일은 콘솔 쪽을 꾸미고 인벤토리를 정렬하는 부분을 좀 해봐야겠다. 정렬 쪽은 특히나 게임 쪽에서 자주 나오는 개념이니 만큼 모른다면 확실히 알아가고 구현이 가능하다면 어떻게 하면 더 나은 구현 방법일지를 고민해봐야겠다. 내일도 파이팅!

 

 

참고 : 

https://holjjack.tistory.com/145

 

[C#] 한글 2byte 로 계산 하는 방법

한글을 2byte로 계산하기위해서 기본적으로 이해를 하셔야 하는 부분은 바로 Unicode 입니다. 해당 부분에 대한 이해없이 단순히 Encoding을 이용해서 Byte 수를 계산한다면, 한글자당 2~3 으로 byte수가

holjjack.tistory.com

 

+ Recent posts