ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Charset이란?
    CS 2024. 2. 17. 00:01

    개요

    프로그래밍을 하다 보면 Encoding, Decoding의 개념등을 활용해보곤 했는데 거기서 사용되는 Charset이라는 개념을 확실하게 잡고 가고자 합니다.

     

    Charset이란?

    컴퓨터는 0과1로 모든 것이 표현됩니다.

    컴퓨터에서 사람이 이해할 수 있는 문자를 표현하기 위해서는 어떻게 해야 할까요?

    사람이 이해할 수 있는 문자가 컴퓨터에 0과 1로 표현되려면 어떻게 해야 할까요?

     

    컴퓨터와 언어가 변환될 수 있도록 각 문자를 정수값에 대응시켜놓은 표가 존재해야 합니다.

    즉, Charset은 인코딩, 디코딩의 방식을 정해주는 것입니다.

     

    컴퓨터는 정의된 Charset을 통하여 Encoding, decoding을 수행합니다.

     

     

    ASCII

     

    해당 표는 ASCII라는 Charset이며 문자 A는 01000001로 인식되고 숫자 6은 00110110으로 인식됩니다.

     

    Charset의 종류

    ASCII, UNICODE, UTF-8 등 다양한 Charset이 존재합니다. 

    초기에는 영문, 숫자를 지원하는 ASCII 코드가 존재하였고 더 많은 언어들을 표현하기 위해 유니코드, UTF-8 이 등장하였습니다.

    KS X 1001와 같은 한국 산업 표준에서 정의한 문자 인코딩 표준도 존재합니다.

     

     

    Kotlin 실습

     

    String.toByteArray 메서드

    @kotlin.internal.InlineOnly
    public inline fun String.toByteArray(charset: Charset = Charsets.UTF_8): ByteArray = (this as java.lang.String).getBytes(charset)

    Kotlin의 toByteArray 메서드는 기본적으로 Charset을 UTF-8으로 정의하여 String을 Byte로 변환합니다.

     

    String 메서드

    @kotlin.internal.InlineOnly
    public inline fun String(bytes: ByteArray, charset: Charset): String = java.lang.String(bytes, charset) as String

    Kotlin의 String 메서드는 바이트 배열의 데이터를 지정된 Charset으로 변환한 문자열을 반환합니다.

     

     

    val originalString = "That will cost €10."
    val stringAsByteArray = originalString.toByteArray()
    
    val utf8String = String(stringAsByteArray, Charsets.UTF_8)
    val asciiString = String(stringAsByteArray, Charsets.US_ASCII)
    
    println(utf8String) //That will cost €10.
    println(asciiString) //That will cost ���10.

     

     

    기본적으로 toByteArray가 UTF-8으로 byteArray를 만들어내기 때문에 ASCII를 토대로 Strng 변환을 하면 Euro 기호 같은 유니코드 문자를 표현하지 못합니다.

     

    val originalString = "That will cost €10.한글"
    val stringAsByteArray = originalString.toByteArray(charset = Charsets.US_ASCII)
    
    val utf8String = String(stringAsByteArray, Charsets.UTF_8)
    val asciiString = String(stringAsByteArray, Charsets.US_ASCII)
    
    println(utf8String) //That will cost ?10.??
    println(asciiString) //That will cost ?10.??

    ASCII로 지정하여 Byte로 표기하면 유로기호와 한글은 ASCII에 정의되어 있지 않기 때문에 ?로 표현됩니다.

     

     

     

    참고자료

    https://pythontoomuchinformation.tistory.com/333

    https://kamang-it.tistory.com/entry/EncodingCharacter-Set%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90euc-kr-utf8-%EB%93%B1

    https://ko.wikipedia.org/wiki/KS_X_1001

    https://www.baeldung.com/kotlin/encode-utf8-string

    'CS' 카테고리의 다른 글

    전각문자와 반각문자  (1) 2024.02.25
    Base64 인코딩이란?  (0) 2024.02.23
    전문통신이란?  (0) 2024.02.18

    댓글

Designed by Tistory.