오늘의 학습 키워드
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
'스파르타 Unity 1기' 카테고리의 다른 글
내일배움캠프 12일차 TIL - TextRPG 만들기 4 (0) | 2023.08.23 |
---|---|
내일배움캠프 11일차 TIL - TextRPG 만들기 3 (0) | 2023.08.22 |
내일배움캠프 2주차 WIL - 알고리즘과 C# 게임 구현 (0) | 2023.08.20 |
내일배움캠프 9일차 TIL - TextRPG 만들기 1 (0) | 2023.08.18 |
내일배움캠프 8일차 TIL - 알고리즘 과제 (0) | 2023.08.17 |