유니코드 표준 압축 방식
| 유니코드 |
|---|
| 부호화 형식 |
| UCS |
| 양방향 텍스트 |
| BOM |
| 한중일 통합 한자 |
| 유니코드 범위 목록 |
| 유니코드 등가성 |
| 유니코드와 HTML |
| 유니코드와 전자 우편 |
| 유니코드 글꼴 |
유니코드 표준 압축 방식(Standard Compression Scheme for Unicode, SCSU)[1]은 유니코드 텍스트를 표현하는 데 필요한 바이트 수를 줄이기 위한 유니코드 기술 표준이다. 특히 해당 텍스트가 주로 하나 또는 소수의 언어별 문자 블록의 문자를 사용하는 경우에 유용하다. 이 방식은 128~255 범위의 값을 특정 128개 문자 블록 내의 오프셋에 동적으로 매핑하는 방식으로 작동한다. 인코더의 초기 조건은 널, 탭, CR, LF 외의 C0 제어 코드를 포함하지 않는 ASCII 및 ISO-8859-1의 기존 문자열을 SCSU 문자열로 처리할 수 있음을 의미한다. 대부분의 알파벳이 연속적인 유니코드 코드 포인트 블록에 존재하므로, 소규모 알파벳과 ASCII 문장 부호 또는 주 알파벳의 창에 맞는 문장 부호를 사용하는 텍스트는 문자당 1바이트(설정 오버헤드 포함, 일반적인 언어의 경우 종종 1바이트에 불과함)로 인코딩될 수 있으며, 대부분의 다른 문장 부호는 비잠금 시프트를 통해 기호당 2바이트로 인코딩될 수 있다. SCSU는 또한 비알파벳 언어를 처리하기 위해 내부적으로 UTF-16으로 전환할 수 있다.
역사 및 사용
로이터는 원래 SCSU를 개발했으며, 당시에는 Reuters Compression Scheme for Unicode의 약어인 RCSU라는 이름으로 사용했다.[2][3][4][5]
처음에는 유니코드 컨소시엄이 이를 문자 인코딩으로 간주했지만,[6] 1999년에는 생각을 바꾸었다. 여전히 전송 인코딩 구문으로 간주되었지만, 잠시 동안은 다른 압축기가 동일한 텍스트에 대해 다른 출력을 생성할 수 있다는 이유로 더 이상 문자 인코딩으로 간주되지 않았다.[7] 그러나 2004년에 이 결정은 번복되었고, 현재 SCSU는 단순 또는 복합 문자 인코딩 방식과 달리 압축 문자 인코딩 방식으로 간주된다.[8][9]
로만 치보라(GNU 유니폰트의 저자)는 압축 해제기를 작성했다.[10] IBM이 기여한 압축 해제기는 International Components for Unicode에서 자바로 작성된 압축기와 함께 찾을 수 있다.[11] 더 간단한 참조 코덱은 TR6의 첨부 파일로 제공된다.
휴대폰 및 기타 모바일 장치를 위한 운영 체제인 심비안 OS는 SCSU를 사용하여 문자열을 직렬화한다.
SQL Server 2008 R2는 SCSU를 사용하여 nchar(n) 및 nvarchar(n) 열에 저장된 유니코드 값(여기서 UCS-2 인코딩의 문자열을 의미)을 압축하며, 데이터의 언어에 따라 15%에서 50% 사이의 공간 절약을 달성한다(UTF-8은 유니코드의 ASCII 부분 집합에 대해서만 50% 절감 효과를 제공한다).[12]
방식
다음 섹션에서는 압축된 SCSU 스트림의 구성을 간략하게 설명한다. 전체 설명(압축 해제기와 일치)은 UTS #6 문서를 참조한다.
인코딩 모드
SCSU는 단일 바이트 모드에서 시작하며, 이 모드에서는 압축된 윈도우 인코딩을 사용한다. UTF-16BE "유니코드" 모드로 전환하고, 해당 모드에서 다시 단일 바이트 모드로 전환하는 명령이 존재한다.
윈도우 인코딩
SCSU의 핵심은 0x80-0xff 바이트의 의미가 정의되는 윈도우에 있다. 간단한 스크립트와 문장 부호를 위한 8개의 정적 윈도우와 더 많은 문자를 사용하는 스크립트를 위한 6가지 유형의 동적 윈도우(및 "하프 유니코드 블록" 윈도우와 보조 평면을 위한 사용자 정의 윈도우)가 있다.
간단한 윈도우와 동적 윈도우는 모두 특수 명령 문자를 통해 선택된다. 현재 블록에 맞지 않는 개별 문자의 경우, 인용을 위한 명령 문자가 제공된다.
범용 일반 텍스트 압축 방식과의 비교
UTF-16 또는 UTF-8 텍스트가 이전 유니코드 인코딩의 텍스트보다 더 많은 공간을 차지할 수 있기 때문에, 이 문제를 완화하기 위해 SCSU와 같은 압축을 사용할 수 있다.[13] 범용 압축기와 비교할 때 SCSU를 사용하는 것이 반드시 유리한 것은 아니다.[5] 또한, 텍스트 인코딩으로 사용될 수 있지만, 알고리즘의 상태 유지 특성 때문에 기본적인 텍스트 작업이 비자명해지므로 내부 텍스트 표현으로 사용할 때 어려움이 발생할 수 있다.
순수하게 압축 알고리즘으로 취급할 때, SCSU는 몇 킬로바이트 이상의 텍스트에 대해 대부분의 일반적으로 사용되는 범용 알고리즘보다 성능이 떨어진다.
SCSU는 길이가 몇 문자에 불과한 텍스트도 유용하게 압축할 수 있다는 장점이 있다. 반면 대부분의 대규모 압축기는 자체 오버헤드를 상쇄하기 위해 수백 바이트의 데이터가 필요하다. 심비안 OS에서는 작은 텍스트 문자열의 잘라내기, 복사 및 붙여넣기와 같은 클립보드 작업에도 SCSU가 사용된다.
HTML에서
W3C[14][15] 및 WHATWG[16] HTML 표준은 HTML 문서에서 SCSU 지원을 금지한다. 이는 HTML이 비 ASCII 호환 인코딩을 염두에 두고 설계되지 않았기 때문이다. 과거에는 브라우저의 이러한 인코딩 처리 미숙으로 인해 사이트 간 스크립팅 취약점이 시연된 바 있다.[17]
각주
- ↑ “UTS #6: Compression Scheme for Unicode”. 2005년 5월 6일. 2008년 6월 13일에 확인함.
SCSU defines a compact encoding, which is sometimes useful. However, Unicode text is much more commonly stored and transmitted in UTF-8 which is less compact (except for ASCII), much simpler, and does not present any security issues. For longer texts, general-purpose compression is effective and common.
- ↑ “Ninth International Unicode Conference - Friday - Track B”.
- ↑ “Tenth International Unicode Conference - Conference Program”.
- ↑ “Compression Scheme for Unicode”.
- ↑ 가 나 “A survey of Unicode compression” (PDF).
- ↑ “UTR#17: Character Encoding Model”.
- ↑ https://unicode.org/reports/tr17/tr17-3.html#Transfer Encoding Syntax
- ↑ “UTR#17: Character Encoding Model”. 2004년 7월 14일.
- ↑ “UTR#17: Unicode Character Encoding Model”. 《unicode.org》. 2023년 11월 14일에 확인함.
- ↑ “This is a deflator to UTF-8 output for input compressed in SCSU”. 1999년 9월 8일에 원본 문서에서 보존된 문서.
- ↑ “International Components for Unicode”. 《GitHub》. 2021년 10월 22일.
- ↑ “Unicode Compression Implementation (SQL Server 2008 R2 Books Online)”. 2008년 8월 18일에 확인함.
- ↑ “Implementation Guidelines” (PDF). 2015년 7월 30일에 원본 문서 (PDF)에서 보존된 문서.
- ↑ “8.2.2.3. Character encodings”. 《HTML 5.1 Standard》. W3C.
- ↑ “8.2.2.3. Character encodings”. 《HTML 5 Standard》. W3C.
- ↑ “12.2.3.3 Character encodings”. 《HTML Living Standard》. WHATWG.
- ↑ “<meta> - HTML”. 《MDN Web Docs》. Mozilla. 2018년 10월 3일에 원본 문서에서 보존된 문서.
- 잘못된 파일 링크가 포함된 문서
- 위키데이터 속성 P18을 사용하는 문서
- 위키데이터 속성 P41을 사용하는 문서
- 위키데이터 속성 P94를 사용하는 문서
- 위키데이터 속성 P117을 사용하는 문서
- 위키데이터 속성 P154를 사용하는 문서
- 위키데이터 속성 P213을 사용하는 문서
- 위키데이터 속성 P227을 사용하는 문서
- 위키데이터 속성 P242를 사용하는 문서
- 위키데이터 속성 P244를 사용하는 문서
- 위키데이터 속성 P245를 사용하는 문서
- 위키데이터 속성 P268을 사용하는 문서
- 위키데이터 속성 P269를 사용하는 문서
- 위키데이터 속성 P271을 사용하는 문서
- 위키데이터 속성 P347을 사용하는 문서
- 위키데이터 속성 P349를 사용하는 문서
- 위키데이터 속성 P350을 사용하는 문서
- 위키데이터 속성 P373을 사용하는 문서
- 위키데이터 속성 P380을 사용하는 문서
- 위키데이터 속성 P396을 사용하는 문서
- 위키데이터 속성 P409를 사용하는 문서
- 위키데이터 속성 P428을 사용하는 문서
- 위키데이터 속성 P434를 사용하는 문서
- 위키데이터 속성 P435를 사용하는 문서
- 위키데이터 속성 P436을 사용하는 문서
- 위키데이터 속성 P454를 사용하는 문서
- 위키데이터 속성 P496을 사용하는 문서
- 위키데이터 속성 P549를 사용하는 문서
- 위키데이터 속성 P650을 사용하는 문서
- 위키데이터 속성 P651을 사용하는 문서
- 위키데이터 속성 P691을 사용하는 문서
- 위키데이터 속성 P716을 사용하는 문서
- 위키데이터 속성 P781을 사용하는 문서
- 위키데이터 속성 P791을 사용하는 문서
- 위키데이터 속성 P864를 사용하는 문서
- 위키데이터 속성 P865를 사용하는 문서
- 위키데이터 속성 P886을 사용하는 문서
- 위키데이터 속성 P902를 사용하는 문서
- 위키데이터 속성 P906을 사용하는 문서
- 위키데이터 속성 P947을 사용하는 문서
- 위키데이터 속성 P950을 사용하는 문서
- 위키데이터 속성 P966을 사용하는 문서
- 위키데이터 속성 P982를 사용하는 문서
- 위키데이터 속성 P1003을 사용하는 문서
- 위키데이터 속성 P1004를 사용하는 문서
- 위키데이터 속성 P1005를 사용하는 문서
- 위키데이터 속성 P1006을 사용하는 문서
- 위키데이터 속성 P1015를 사용하는 문서
- 위키데이터 속성 P1045를 사용하는 문서
- 위키데이터 속성 P1048을 사용하는 문서
- 위키데이터 속성 P1053을 사용하는 문서
- 위키데이터 속성 P1146을 사용하는 문서
- 위키데이터 속성 P1153을 사용하는 문서
- 위키데이터 속성 P1157을 사용하는 문서
- 위키데이터 속성 P1186을 사용하는 문서
- 위키데이터 속성 P1225를 사용하는 문서
- 위키데이터 속성 P1248을 사용하는 문서
- 위키데이터 속성 P1273을 사용하는 문서
- 위키데이터 속성 P1315를 사용하는 문서
- 위키데이터 속성 P1323을 사용하는 문서
- 위키데이터 속성 P1330을 사용하는 문서
- 위키데이터 속성 P1362를 사용하는 문서
- 위키데이터 속성 P1368을 사용하는 문서
- 위키데이터 속성 P1375를 사용하는 문서
- 위키데이터 속성 P1407을 사용하는 문서
- 위키데이터 속성 P1556을 사용하는 문서
- 위키데이터 속성 P1584를 사용하는 문서
- 위키데이터 속성 P1695를 사용하는 문서
- 위키데이터 속성 P1707을 사용하는 문서
- 위키데이터 속성 P1736을 사용하는 문서
- 위키데이터 속성 P1886을 사용하는 문서
- 위키데이터 속성 P1890을 사용하는 문서
- 위키데이터 속성 P1907을 사용하는 문서
- 위키데이터 속성 P1908을 사용하는 문서
- 위키데이터 속성 P1960을 사용하는 문서
- 위키데이터 속성 P1986을 사용하는 문서
- 위키데이터 속성 P2041을 사용하는 문서
- 위키데이터 속성 P2163을 사용하는 문서
- 위키데이터 속성 P2174를 사용하는 문서
- 위키데이터 속성 P2268을 사용하는 문서
- 위키데이터 속성 P2349를 사용하는 문서
- 위키데이터 속성 P2418을 사용하는 문서
- 위키데이터 속성 P2456을 사용하는 문서
- 위키데이터 속성 P2484를 사용하는 문서
- 위키데이터 속성 P2558을 사용하는 문서
- 위키데이터 속성 P2750을 사용하는 문서
- 위키데이터 속성 P2980을 사용하는 문서
- 위키데이터 속성 P3223을 사용하는 문서
- 위키데이터 속성 P3233을 사용하는 문서
- 위키데이터 속성 P3348을 사용하는 문서
- 위키데이터 속성 P3372를 사용하는 문서
- 위키데이터 속성 P3407을 사용하는 문서
- 위키데이터 속성 P3430을 사용하는 문서
- 위키데이터 속성 P3544를 사용하는 문서
- 위키데이터 속성 P3562를 사용하는 문서
- 위키데이터 속성 P3563을 사용하는 문서
- 위키데이터 속성 P3601을 사용하는 문서
- 위키데이터 속성 P3723을 사용하는 문서
- 위키데이터 속성 P3788을 사용하는 문서
- 위키데이터 속성 P3829를 사용하는 문서
- 위키데이터 속성 P3863을 사용하는 문서
- 위키데이터 속성 P3920을 사용하는 문서
- 위키데이터 속성 P3993을 사용하는 문서
- 위키데이터 속성 P4038을 사용하는 문서
- 위키데이터 속성 P4055를 사용하는 문서
- 위키데이터 속성 P4114를 사용하는 문서
- 위키데이터 속성 P4143을 사용하는 문서
- 위키데이터 속성 P4186을 사용하는 문서
- 위키데이터 속성 P4423을 사용하는 문서
- 위키데이터 속성 P4457을 사용하는 문서
- 위키데이터 속성 P4534를 사용하는 문서
- 위키데이터 속성 P4535를 사용하는 문서
- 위키데이터 속성 P4581을 사용하는 문서
- 위키데이터 속성 P4613을 사용하는 문서
- 위키데이터 속성 P4955를 사용하는 문서
- 위키데이터 속성 P5034를 사용하는 문서
- 위키데이터 속성 P5226을 사용하는 문서
- 위키데이터 속성 P5288을 사용하는 문서
- 위키데이터 속성 P5302를 사용하는 문서
- 위키데이터 속성 P5321을 사용하는 문서
- 위키데이터 속성 P5368을 사용하는 문서
- 위키데이터 속성 P5504를 사용하는 문서
- 위키데이터 속성 P5587을 사용하는 문서
- 위키데이터 속성 P5736을 사용하는 문서
- 위키데이터 속성 P5818을 사용하는 문서
- 위키데이터 속성 P6213을 사용하는 문서
- 위키데이터 속성 P6734를 사용하는 문서
- 위키데이터 속성 P6792를 사용하는 문서
- 위키데이터 속성 P6804를 사용하는 문서
- 위키데이터 속성 P6829를 사용하는 문서
- 위키데이터 속성 P7293을 사용하는 문서
- 위키데이터 속성 P7303을 사용하는 문서
- 위키데이터 속성 P7314를 사용하는 문서
- 위키데이터 속성 P7902를 사용하는 문서
- 위키데이터 속성 P8034를 사용하는 문서
- 위키데이터 속성 P8189를 사용하는 문서
- 위키데이터 속성 P8381을 사용하는 문서
- 위키데이터 속성 P8671을 사용하는 문서
- 위키데이터 속성 P8980을 사용하는 문서
- 위키데이터 속성 P9070을 사용하는 문서
- 위키데이터 속성 P9692를 사용하는 문서
- 위키데이터 속성 P9725를 사용하는 문서
- 위키데이터 속성 P9984를 사용하는 문서
- 위키데이터 속성 P10020을 사용하는 문서
- 위키데이터 속성 P10299를 사용하는 문서
- 위키데이터 속성 P10608을 사용하는 문서
- 위키데이터 속성 P10832를 사용하는 문서
- 위키데이터 속성 P11249를 사용하는 문서
- 위키데이터 속성 P11646을 사용하는 문서
- 위키데이터 속성 P11729를 사용하는 문서
- 위키데이터 속성 P12204를 사용하는 문서
- 위키데이터 속성 P12362를 사용하는 문서
- 위키데이터 속성 P12754를 사용하는 문서
- 위키데이터 속성 P13049를 사용하는 문서
- 유니코드 변환 형식