숫자 간격 벌어짐 현상을 해결해 보도록 합시다. '전각문자와 반각문자'에 대해 알아보려고 해요!
숫자를 입력하다 보면 어딘가 어색하게 숫자의 간격이 많이 벌어진 것처럼 보이는 경우가 있습니다. "혹시 실수로 스페이스를 넣었나?" 하며 간격 사이사이마다 클릭을 해보아도 별도의 공간이 보이지가 않습니다. 어떻게 된 것일까요? 해결을 위해 전각(全角) 문자와 반각(半角) 문자에 대해 알아보도록 합시다.
글자의 배치 과정을 기준으로 전각문자와 반각문자로 구분할 수 있습니다. 한글은 모두 전각문자에 속하며, 숫자와 영문은 전각문자와 반각문자를 각각 나눌 수 있습니다. 윈도우에서 전각, 반각 설정을 하는 단축키는 알트를 누르고 이퀄을 누르는 것입니다. (단축키 : Alt + =) 반각에서 전각, 또는 그 반대로 설정을 복구하려면 다시 한번 단축키를 눌러 주세요.
코드페이지 949 인코딩을 기준으로 하면, 반각문자는 1바이트이며 전각문자는 2바이트의 공간을 차지합니다.
위의 사진을 보더라더 반각문자 "12"와 전각문자 "1"의 길이가 유사한 것이 보입니다.
다음은 전각문자와 반각문자의 길이 차이를 몇 가지 인코딩별로 비교해 본 것입니다. 참고하시면 될 것입니다.
public void BeomSang()
{
string 반각숫자 = "12345";
string 전각숫자 = "12345";
string 반각한글 = "가나다";
string 전각한글 = "가나다";
string 반각영문 = "abc";
string 전각영문 = "abc";
string[,] arr = { { "[반각] 숫자", 반각숫자 },
{ "[전각] 숫자", 전각숫자 },
{ "[반각] 한글", 반각한글 },
{ "[전각] 한글", 전각한글 },
{ "[반각] 영문", 반각영문 },
{ "[전각] 영문", 전각영문 } };
for (int i = 0; i < arr.GetLength(0); i++)
{
Debug.WriteLine($"{arr[i, 0]} \"{arr[i, 1]}\".Length = {arr[i, 1].Length}");
Debug.WriteLine($"{arr[i, 0]} \"{arr[i, 1]}\".Default.Length = {Encoding.Default.GetBytes(arr[i, 1]).Length}");
Debug.WriteLine($"{arr[i, 0]} \"{arr[i, 1]}\".ASCII.Length = {Encoding.ASCII.GetBytes(arr[i, 1]).Length}");
Debug.WriteLine($"{arr[i, 0]} \"{arr[i, 1]}\".UTF8.Length = {Encoding.UTF8.GetBytes(arr[i, 1]).Length}");
Debug.WriteLine($"{arr[i, 0]} \"{arr[i, 1]}\".UTF7.Length = {Encoding.UTF7.GetBytes(arr[i, 1]).Length}");
Debug.WriteLine($"{arr[i, 0]} \"{arr[i, 1]}\".UTF32.Length = {Encoding.UTF32.GetBytes(arr[i, 1]).Length}");
Debug.WriteLine($"{arr[i, 0]} \"{arr[i, 1]}\".Unicode.Length = {Encoding.Unicode.GetBytes(arr[i, 1]).Length}");
Debug.WriteLine($"{arr[i, 0]} \"{arr[i, 1]}\".BigEndianUnicode.Length = {Encoding.BigEndianUnicode.GetBytes(arr[i, 1]).Length}");
}
}
예제 소스의 결과는 다음과 같습니다.
- 단순히 문자의 길이만 비교하면 반각과 전각의 길이는 동일합니다.
- 기본 인코딩 CP949는 한글이 2바이트이며, 숫자와 영문에서 반각은 1바이트이고 전각은 2바이트입니다. 한글은 전각과 반각의 구분이 없기에 바이트 길이는 동일합니다.
- 단순 문자열 길이 비교와 아스키 인코딩 길이 비교는 동일한 값입니다.
- UTF8 인코딩에서 전각문자는 3바이트이고, 반각문자는 1바이트입니다. 한글은 전각문자이기에 3바이트입니다.
- 유니코드 인코딩은 전각문자와 반각문자 모두 각각 2바이트입니다.
[반각] 숫자 "12345".Length = 5
[반각] 숫자 "12345".Default.Length = 5
[반각] 숫자 "12345".ASCII.Length = 5
[반각] 숫자 "12345".UTF8.Length = 5
[반각] 숫자 "12345".UTF7.Length = 5
[반각] 숫자 "12345".UTF32.Length = 20
[반각] 숫자 "12345".Unicode.Length = 10
[반각] 숫자 "12345".BigEndianUnicode.Length = 10
[전각] 숫자 "12345".Length = 5
[전각] 숫자 "12345".Default.Length = 10
[전각] 숫자 "12345".ASCII.Length = 5
[전각] 숫자 "12345".UTF8.Length = 15
[전각] 숫자 "12345".UTF7.Length = 16
[전각] 숫자 "12345".UTF32.Length = 20
[전각] 숫자 "12345".Unicode.Length = 10
[전각] 숫자 "12345".BigEndianUnicode.Length = 10
[반각] 한글 "가나다".Length = 3
[반각] 한글 "가나다".Default.Length = 6
[반각] 한글 "가나다".ASCII.Length = 3
[반각] 한글 "가나다".UTF8.Length = 9
[반각] 한글 "가나다".UTF7.Length = 10
[반각] 한글 "가나다".UTF32.Length = 12
[반각] 한글 "가나다".Unicode.Length = 6
[반각] 한글 "가나다".BigEndianUnicode.Length = 6
[전각] 한글 "가나다".Length = 3
[전각] 한글 "가나다".Default.Length = 6
[전각] 한글 "가나다".ASCII.Length = 3
[전각] 한글 "가나다".UTF8.Length = 9
[전각] 한글 "가나다".UTF7.Length = 10
[전각] 한글 "가나다".UTF32.Length = 12
[전각] 한글 "가나다".Unicode.Length = 6
[전각] 한글 "가나다".BigEndianUnicode.Length = 6
[반각] 영문 "abc".Length = 3
[반각] 영문 "abc".Default.Length = 3
[반각] 영문 "abc".ASCII.Length = 3
[반각] 영문 "abc".UTF8.Length = 3
[반각] 영문 "abc".UTF7.Length = 3
[반각] 영문 "abc".UTF32.Length = 12
[반각] 영문 "abc".Unicode.Length = 6
[반각] 영문 "abc".BigEndianUnicode.Length = 6
[전각] 영문 "abc".Length = 3
[전각] 영문 "abc".Default.Length = 6
[전각] 영문 "abc".ASCII.Length = 3
[전각] 영문 "abc".UTF8.Length = 9
[전각] 영문 "abc".UTF7.Length = 10
[전각] 영문 "abc".UTF32.Length = 12
[전각] 영문 "abc".Unicode.Length = 6
[전각] 영문 "abc".BigEndianUnicode.Length = 6