발표는 인코딩의 핵심 개념을 명확히 정의하는 것부터 시작합니다.
인코딩 기본 개념
- 
    코드 포인트 (Code Point): 문자 집합(Coded Character Set) 내에서 문자를 나타내는 추상적인 숫자입니다. 유니코드(Unicode)는 대표적인 문자 집합입니다. 
- 
    인코딩 (Encoding): 코드 포인트가 디스크나 메모리에 바이트 형태로 저장되는 방식을 정의합니다. UTF-8, UTF-16, ShiftJIS 등이 인코딩의 예시입니다. 동일한 코드 포인트라도 인코딩 방식에 따라 다른 바이트 시퀀스로 표현될 수 있습니다. 
다양한 언어의 인코딩 처리 방식
- 
    Ruby 1.8, Python 2, C: 문자열을 단순히 바이트 배열(binary string)로 취급합니다. 이는 인코딩 정보가 없어 UTF-16과 UTF-8 문자열을 결합할 경우 데이터 손상(예: 다이아몬드 물음표 문자)을 쉽게 초래합니다. Kcode는 정규 표현식의 유니코드 지원을 위한 제한적인 기능이었습니다.
- 
    Java, Python 3: 모든 문자열을 유니코드 배열(코드 포인트)로 취급하며, 내부적으로 UTF-16을 사용합니다. 시스템 경계에서 들어오는 모든 데이터를 명시적으로 유니코드로 변환해야 합니다. 이는 명확한 경계 처리를 요구하지만, ShiftJIS의 유니코드 왕복 변환 문제(round-trip problem)나 엔화 기호(yen sign)와 같은 특정 문자의 인코딩 불일치 문제와 같은 실질적인 어려움을 야기합니다. 
Ruby 1.9의 인코딩 접근 방식
Ruby 1.9는 문자열이 바이트 배열과 함께 인코딩 정보를 함께 갖도록 설계되었습니다.
- 
    명시적인 오류 발생: 서로 다른 인코딩의 문자열을 결합하려 할 때 Incompatible character encodings오류를 발생시켜 개발자가 문제를 인지하고 해결하도록 돕습니다. 이는 데이터 손상을 방지하는 긍정적인 메커니즘입니다.
- 
    force_encoding의 올바른 사용:force_encoding은 바이너리(인코딩되지 않은) 문자열에 올바른 인코딩을 ‘지정’할 때만 사용해야 합니다. 이미 인코딩된 문자열에 잘못 사용하면 데이터가 손상될 수 있습니다.
- 
    encode및encode!: 문자열의 인코딩을 한 형식에서 다른 형식으로 ‘변환’할 때 사용되는 올바른 방법입니다.encode!는 원본 문자열을 변경(destructive)합니다.
- 
    Encoding.default_internal: 애플리케이션 내부에서 사용할 기본 인코딩(예: UTF-8)을 설정하는 기능입니다. 라이브러리(특히 데이터베이스 드라이버)가 외부에서 들어오는 문자열을 이default_internal인코딩으로 자동 변환하도록 유도하여 일관된 문자열 처리를 가능하게 합니다.
- 
    라이브러리의 역할: HTTP 요청, 데이터베이스 드라이버 등 시스템 경계에서 데이터를 가져오는 라이브러리들이 인코딩 정보를 올바르게 파악하고 Ruby 1.9의 encode!를 사용하여default_internal에 맞춰 문자열을 변환하는 것이 중요합니다.