문자 인코딩의 이해와 문제점
-
Mojibake: 잘못된 문자 인코딩으로 인해 문자가 깨져 보이는 현상.
- 주요 인코딩 표준:
- 유니코드(Unicode): UTF-8, UTF-16, UTF-3 2.
- 일본어 인코딩: 여러 표준이 여전히 사용됨.
-
코드 포인트(Code Point): 고유한 문자 또는 기호를 나타내는 하나 이상의 바이트.
- UTF-8의 특징:
- 가변 길이 인코딩으로 ASCII 문자는 1바이트로 표현.
- 다중 바이트 문자는 첫 바이트의 상위 비트로 식별 가능하여 스트림 중간에서도 문자 파악 용이.
- 인터넷, 파일 시스템, XML의 기본 인코딩, Flash의 유일한 인코딩.
- 단점: 특정 스크립트에서는 더 많은 바이트를 사용, 문자 중간에 문자열이 잘릴 가능성, 과도한 통합(예: 숫자 ‘0’과 알파벳 ‘O’를 동일하게 처리) 비판.
데이터베이스 연동 시 주의사항
-
MySQL UTF-8 구현 제약: MySQL 5는 UTF-8에 대해 3바이트만 지원하여 Basic Multilingual Plane(대부분의 현대 언어)은 커버하지만, 수학 기호, 설형 문자, 일부 중국어, 클링온어, 엘프어(Tangoir 스크립트) 등 4바이트가 필요한 문자는 처리 불가. (PostgreSQL은 4바이트 지원)
-
인코딩 설정 일관성: 데이터베이스 드라이버, 연결, 데이터베이스 자체의 문자 인코딩 설정은 모두 동일하게 유지되어야 함. 불일치 시 문자 깨짐 발생.
콜레이션(Collation)의 중요성
-
정렬(Sorting): 언어마다 문자 정렬 방식이 다름 (예: 스웨덴어와 독일어의 알파벳 순서). UTF-8 바이트 순서 정렬은 종종 부정확하지만, 다국어 목록 정렬의 일반적인 타협점.
-
동등성(Equality) 비교: 콜레이션은 문자열 동등성 비교에도 사용.
- 사례: MySQL에서 UTF-8 대소문자 구분 없는 콜레이션(case-insensitive collation) 사용 시 ‘America’와 ‘América’가 동일하게 평가되어 고유성 제약 조건 위반 발생.
- 해결책: UTF-8 바이너리 비교(binary comparison) 사용. 이는 의도된 동작이지만, 개발자가 주의해야 할 부분.
Ruby 코드에서의 문자열 처리
-
Ruby 1.8: 문자열을 바이트의 연속으로 처리하여 다중 바이트 문자열에서 인덱싱 시 문제가 발생할 수 있음.
-
Ruby 1.9: 문자열을 문자의 연속으로 처리하여 다중 바이트 문자열 인덱싱이 직관적이고 올바르게 작동.
-
권장 사항: Ruby 1.9 사용. 1.8 사용 시 J-code 라이브러리 활용.
HTML 출력
Content-Type헤더 또는<meta>태그를 통해 문자셋 지정 권장.<meta>태그 사용 시 HTML 문서가 어디로 이동하든 올바른 문자셋 유지 가능.