티스토리 뷰
- 처음에 악센트 없는 영어 문자로 127 가지 문자를 정했다. 이는 7bits에 저장할 수 있으며 이를 ASCII라고 불렀다.
- 그러나 그 이외의 문자들(여러 언어, 기호, 그림용 문자)를 128 - 255 에 각각 정하기 시작했다.
- 이렇게 다른 시스템들을 code page라고 한다.
- 더군다나 아시아의 알파벳은 천 개가 넘는다.
- byte를 string으로 바꾸는 건 쉽지만 반대로 하는 건 엄청 복잡한 일이었다.
ASCII
Unix가 만들어진 시기에 문자는 오로지 영어와 숫자뿐이었다. 이를 숫자 32부터 127까지 매긴 후 ASCII라고 한다. 이 문자들은 7bits 을 이용해 저장할 수 있었고, 1byte가 8 bit인 컴퓨터를 썼으므로 잉여 1 bit가 남게 되었다. 이 비트를 사람들은 각자의 목적으로 사용했다.
그러나 128부터 255까지의 공간을 정의해야겠다는 사람들이 여러 명이었고, 사람들은 각각 본인이 필요한 문자들을 정의하기 시작했다. 드로잉 문자부터 OEM 문자, 히브리어, 이스라엘어, 러시아 어 등등이었다. 결국 이 문자 체계들은 ANSI 표준으로 코드화되었고 이를 code page라고 한다.
정의했다고 해서 하나의 컴퓨터에서 여러 code page에 맞춰 읽어오는 시스템을 만드는 것은 불가능에 가까웠다. 게다가 아시아의 경우는 더 했는데, 알파벳의 수가 몇 천개였기 때문에 1byte(8bits)안에 정의할 수 없었다.
그래도 서로 다른 코드 페이지를 사용하는 하나의 컴퓨터에서 다른 컴퓨터로 문자를 옮기는 경우가 많이 없었기 때문에 괜찮았다. 그러나 인터넷이 발달하면서 점점 그 경우의 수가 많아졌고, 다행히도 유니코드가 탄생했다.
Unicode의 등장
유니코드는 전 세계적으로 존재하는 글쓰기 시스템을 합리적으로 정의한 하나의 문자 체계이다.
유니코드에 관련된 흔한 오해로 유니코드의 모든 문자는 16 bit를 갖는다는 것인데, 이는 맞기도 하고 아니기도 하다.
유니코드는 여전히 이론적인 개념인 code point에 매핑된다. magic number == code point
The U+ means “Unicode” and the numbers are hexadecimal
- 유니코드가 단순히 16bit에 문자를 저장한다는 것은 오해다. 맞지만 아니다.
- 유니코드는 여전히 이론적인 개념인 code point에 매핑된다
- magic number == code point
- The U+ means “Unicode” and the numbers are hexadecimal
Encoding
문자를 어떻게 메모리에 저장하고 어떻게 읽느냐
unicode는 big endian, little endian 으로 바이트 순서를 어떻게 할지가 다른데, 이를 유니코드 스트링의 가장 앞 문자로 FE FF 와 같이 적어서 나타낸다
읽을 수 없는 문자인 경우 ? 가 나타난다
UTF-8
- 유니코드를 저장하는 시스템
- 127 이하의 코드는 하나의 바이트에 저장. 그 이상은 2,3 바이트에 저장하는 방식
UTF-16
- 모든 문자를 2바이트에 저장
가장 중요한 것은 읽으려는 문자열이 어떤 인코딩 방식으로 저장되어 있는지 알아야 한다는 것이다.
Java
Java는 String에서 사용하는 인코딩은 UTF-16 BE(Big Endian)이다. 문자열 전송/수신을 위해서 직렬화가 필요할 때에는 변형된 UTF-8(Modified UTF-8)을 사용한다. Java의 DataInput, DataOutput 인터페이스 구현체에서는 문자열을 기록하거나 읽어들일 때 이 변형된 UTF-8을 사용한다.
참고
모든 개발자들이 필수적으로 알아야 할 유니코드와 문자 셋에 관한 고찰 - 조엘
'Web' 카테고리의 다른 글
| J2EE 스펙 정리 (0) | 2024.02.26 |
|---|---|
| escape 문자 json ↔ string (0) | 2023.01.03 |
| REST란 무엇인가? (0) | 2021.12.22 |
| HTTP Method 7가지 (0) | 2021.12.22 |
| 웹 소켓 (0) | 2021.11.11 |
- Total
- Today
- Yesterday
- Generic
- Git
- point
- Encoding
- ASCII
- IntelliJ
- aws
- querydsl
- SQL 전문가 가이드
- 암호화
- Lombok
- effective-java
- ruby
- fetchResults
- WebClient
- 실용주의
- sort algorithm
- annotation
- Java
- TroubleShooting
- SHA
- 이벤트스토밍
- ActiveAdmin
- Spring-Boot
- gitignore
- 코테 log
- 메모리 릭
- DesignSystem
- 사고..
- 이펙티브자바
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |