ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 전각문자와 반각문자
    CS 2024. 2. 25. 00:01

    전각문자와 반각문자

    Halfwidh는 반각문자, Fullwith는 전각문자 입니다.

     

    전각문자와 반각문자는 주로 한국, 중국, 일본의 인쇄 문화에서 사용하는 용어입니다.

    문자의 폭이 일반적인 영문자의 고정 폭의 두 배에 달하는 것을 전각문자라고 하며 전각문자의 절반을 폭으로 하는 문자를 반각문자라고 합니다.

     

    위의 Halfull 프로그램에서 Fullwidth(전각문자) 부분을 보면 간격이 넓은 것을 확인할 수 있습니다.

     

    그런데 Computer Science에서 인쇄 용어가 왜 등장하게 될까요?

     

    CS에서의 전각문자와 반각문자 표현

    컴퓨터에서는 전통적으로 반각 문자를 1바이트로, 전각 문자를 2바이트로 인코딩하곤 했습니다.

    숫자 "3"이나 영어 "a"를 표현할 때는 1바이트로 충분하지만 한글 "가"를 표현하기 위해서는 2바이트가 필요합니다.

     

    알파벳과 한글이 같이 존재하게 되면 1바이트와 2바이트가 혼재되어 있을것이며 금융권에서 통신을 수행할 때는 알파벳도 전각문자인 2바이트로 만들어서 통신하기도 합니다.

     

    중국어, 일본어, 한국어와 같은 텍스트를 균일하게 표시해야 하는 상황때문에 등장하게 되었습니다.

     

    Kotlin 확장함수로 전각문자 반각문자 변환하기

    fun String.toFullWidthCharacter(): String{
        val sb = StringBuilder()
        for (i in this.indices) {
            var c = this[i]
            // English alphabet or special characters
            if (c >= 0x21.toChar() && c <= 0x7e.toChar()) {
                c += 0xfee0
            }
            // space (=space)
            else if (c == 0x20.toChar()) {
                c = 0x3000.toChar()
            }
            sb.append(c)
        }
        return sb.toString()
    }
    
    fun String.toHalfWidthCharacter(): String{
        val sb = StringBuilder()
        for (i in this.indices) {
            var c = this[i]
            // English alphabet or special characters
            if (c >= '!' && c <= '~') {
                c -= 0xfee0
            }
            // space (=space)
            else if (c == ' ') {
                c = 0x20.toChar()
            }
            sb.append(c)
        }
        return sb.toString()
    }

    전각문자와 반각문자는 아스키코드로 120차이가 납니다.

    따라서 0xfee0 이상의 문자는 전각문자이므로 0xfee0를 빼서 일반 문자로 변환하면 반각문자가 나옵니다.

    특수문자 공백(white space)은 0x3000이어서 예외적으로 하드코딩하여 일반 공백(0x20)으로 변경해야 합니다.

     

    테스트 코드

    @Test
    fun `반각 문자 전각 문자 변환 테스트`(){
    	val english = "How does English translate to half-width characters?"
    	println("전각 문자로 변환시 ${english.toFullWidthCharacter()}")
    	println("반각 문자로 변환시 ${english.toHalfWidthCharacter()}")
    
    	val koreanText = "한글은 전각문자 인데 어떻게 변환될까요?"
    	println("전각 문자로 변환시 ${koreanText.toFullWidthCharacter()}")
    	println("반각 문자로 변환시 ${koreanText.toHalfWidthCharacter()}")
    }

     

    테스트 결과

     

     

     

    참고자료

    https://ko.wikipedia.org/wiki/%EC%A0%84%EA%B0%81_%EB%AC%B8%EC%9E%90%EC%99%80_%EB%B0%98%EA%B0%81_%EB%AC%B8%EC%9E%90

    https://steloflute.tistory.com/entry/Halfwidth-and-fullwidth-conversion-program

     

    'CS' 카테고리의 다른 글

    Base64 인코딩이란?  (0) 2024.02.23
    전문통신이란?  (0) 2024.02.18
    Charset이란?  (0) 2024.02.17

    댓글

Designed by Tistory.