ETC
전각문자, 반각문자 정리 (Java)
무대포 개발자
2021. 6. 3. 21:36
728x90
반응형
source 는 Github 에 있습니다.
반각, 전각 문자 개념
- 전각 문자는 정사각형 형태, 반각은 전각의 가로폭을 반으로 줄인 직사각형 형태입니다.
- 영문과 숫자 등은 반각이고, 한글은 전각으로 표현하고 있습니다.
- 컴퓨터에서 보통 반각은 1바이트, 전각은 2바이트로 표현됩니다. (유니코드 등장하기 전까지)
- UTF-8, UTF-16 의 경우 반각 1bytes, 전각 2bytes 가 아닐 수 있습니다.
- 업무 개발을 할 때, 보통 반각문자를 접하지만 가끔 전각문자를 접하기도 합니다. 그래서 정리하게 됐습니다.
- 반각문자가 1bytes, 전각문자가 2bytes 인 인코딩에 대해서 정리하겠습니다. (euc-kr)
전각문자 관련 source
- 전각문자가 2byte 인지 확인하고 길이가 1인지 체크하는 source 입니다.
- 인코딩이 euc-kr 로 설정돼있어서 전각문자를 0xA1, 0xA1 을 전각문자 공백으로 인식합니다.
@Test
public void 전각문자테스트() throws Exception {
// 전각문자 공백 (0xA1 0xA1)
byte[] bytes = {(byte)0xA1, (byte)0xA1};
Assert.assertThat(bytes.length, is(2));
String s = new String(bytes, Charset.forName("euc-kr"));
// 2개의 바이트를 읽어서 하나의 전각문자로 만드니 길이가 1
Assert.assertThat(s.length(), is(1));
byte[] tmp = s.getBytes(Charset.forName("euc-kr"));
// 전각문자를 bytes 변환하면 1개의 전각문자는 2byte
Assert.assertThat(tmp.length, is(2));
}
반각문자, 전각문자 변환 source
/**
* 반각문자 --> 전각문자 변환
*
* @param s
* @return
*/
public static String toFullWidthCharacter(String s) {
if (s == null) {
throw new IllegalArgumentException("s is null");
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 영문 알파벳 or 특수 문자
if (c >= 0x21 && c <= 0x7e) {
c += 0xfee0;
}
// 공백 (=space)
else if (c == 0x20) {
c = 0x3000;
}
sb.append(c);
}
return sb.toString();
}
/**
* 전각문자를 반각문자로 변환
* @param s
* @return
*/
public static String toHalfWidthCharacter(String s) {
if (s == null) {
throw new IllegalArgumentException("s is null");
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 영문 알파벳 or 특수 문자
if (c >= '!' && c <= '~') {
c -= 0xfee0;
}
// 공백 (=space)
else if (c == ' ') {
c = 0x20;
}
sb.append(c);
}
return sb.toString();
}
@Test
public void 반각문자_전각문자_변환_테스트() throws Exception {
String s = " ";
// 반각문자 공백이기에 1bytes
Assert.assertThat(s.getBytes(Charset.forName("euc-kr")).length, is(1));
String fullWidthCharacter = StringUtils.toFullWidthCharacter(s);
// 전각문자 공백이기에 2bytes
Assert.assertThat(fullWidthCharacter.getBytes("euc-kr").length, is(2));
String halfWidthCharacter = StringUtils.toHalfWidthCharacter(fullWidthCharacter);
// 반각문자 bytes 이기에 byte 길이 1
Assert.assertThat(halfWidthCharacter.getBytes("euc-kr").length, is(1));
}