Encoding 클래스

Encoding 클래스

Encoding 인스턴스는 Ruby에서 사용할 수 있는 문자 인코딩 하나를 나타내요. Encoding 네임스페이스 아래에 상수로 정의돼 있고, 이름을 갖고 있으며 선택적으로 별칭(alias)도 가질 수 있어요:

Encoding::US_ASCII.name  # => "US-ASCII"
Encoding::US_ASCII.names # => ["US-ASCII", "ASCII", "ANSI_X3.4-1968", "646"]

인코딩을 인자로 받는 Ruby 메서드는 세 가지 형태의 값을 모두 받아들여요:

  • Encoding 객체
  • 인코딩의 이름
  • 인코딩 이름의 별칭

셋은 서로 동등해요:

'foo'.encode(Encoding::US_ASCII) # Encoding 객체.
'foo'.encode('US-ASCII')         # Encoding 이름.
'foo'.encode('ASCII')            # Encoding 별칭.

인코딩과 그 사용법에 대한 자세한 내용은 Encodings 문서를 참고하세요.

Encoding::ASCII_8BIT는 특수 목적의 인코딩이에요. 문자 문자열이 아니라 주로 바이트 문자열에 쓰이죠. 이름이 말해 주듯 ASCII 범위의 문자는 ASCII 문자로 취급되는데, 다른 ASCII 호환 인코딩을 쓸 때 유용해요.

상수

  • UNICODE_VERSION — 지원되는 Unicode 버전.

속성

  • name[R] — 인코딩의 이름: Encoding::UTF_8.name #=> "UTF-8"
  • to_s[R] — 인코딩의 이름: Encoding::UTF_8.name #=> "UTF-8"

클래스 메서드

  • aliases → {"alias1" => "orig1", ...} — 사용 가능한 인코딩 별칭과 원래 인코딩 이름의 해시를 돌려줘요.

    Encoding.aliases
    #=> {"BINARY"=>"ASCII-8BIT", "ASCII"=>"US-ASCII", "ANSI_X3.4-1968"=>"US-ASCII",
          "SJIS"=>"Windows-31J", "eucJP"=>"EUC-JP", "CP932"=>"Windows-31J"}
    
  • compatible?(obj1, obj2) → enc or nil — 두 객체의 호환성을 확인해요. 두 객체가 모두 문자열이라면, 서로 연결(concat)할 수 있을 때 호환되는 거예요. 호환되면 연결된 문자열의 인코딩을 돌려주고, 아니면 nil을 돌려줘요.

    Encoding.compatible?("\xa1".force_encoding("iso-8859-1"), "b")
    #=> #<Encoding:ISO-8859-1>
    
    Encoding.compatible?(
      "\xa1".force_encoding("iso-8859-1"),
      "\xa1\xa1".force_encoding("euc-jp"))
    #=> nil
    

    객체가 문자열이 아니라면, 인코딩을 갖고 있고 다음 조건 중 하나를 만족할 때 호환돼요:

    • 둘 중 한 인코딩이 US-ASCII 호환
    • 둘 중 한 인코딩이 7비트 인코딩
  • default_external → enc — 기본 외부 인코딩(default external encoding)을 돌려줘요. 이 인코딩은 기본적으로 다음 위치에서 만들어지는 문자열에 적용돼요: CSV, 디스크에서 읽는 File 데이터, SDBM, StringIO, Zlib::GzipReader, Zlib::GzipWriter, String#inspect, Regexp#inspect. 이런 곳에서 만들어진 문자열이 이 인코딩을 가지더라도 그 인코딩이 유효하리라는 보장은 없어요. String#valid_encoding?으로 꼭 확인하세요.

    디스크에 쓰는 File 데이터는 default_internal이 nil이 아니면, 쓸 때 기본 외부 인코딩으로 트랜스코딩돼요.

    기본 외부 인코딩은 -E 옵션으로 초기화돼요. -E가 없으면 Windows에서는 UTF-8, 다른 운영체제에서는 로케일로 초기화돼요.

  • default_external = enc — 기본 외부 인코딩을 설정해요. Ruby 코드에서 Encoding::default_external을 직접 설정하는 건 권장하지 않아요. 값을 바꾸기 전에 만들어진 문자열과 바뀐 뒤 만들어진 문자열의 인코딩이 달라질 수 있거든요. 대신 ruby -E로 올바른 default_external을 지정해 시작하는 게 좋아요.

  • default_internal → enc — 기본 내부 인코딩(default internal encoding)을 돌려줘요. default_internal이 nil이 아니라면 문자열은 다음 위치에서 기본 내부 인코딩으로 트랜스코딩돼요: CSV, Etc.sysconfdir/Etc.systmpdir, 디스크에서 읽는 File 데이터, DirFile 이름, Integer#chr, String#inspect/Regexp#inspect, Readline이 돌려주는 문자열, SDBM이 돌려주는 문자열, Time#zone, ENV의 값, $PROGRAM_NAME을 포함한 ARGV의 값.

    추가로 String#encode/String#encode!는 인코딩을 주지 않으면 기본 내부 인코딩을 사용해요. 만들어진 문자열의 인코딩으로는 default_internal이 아니라 스크립트 인코딩(__ENCODING__)이 쓰여요. Encoding::default_internal-E 옵션으로 초기화되고, 없으면 nil이에요.

  • default_internal = enc or nil — 기본 내부 인코딩을 설정하거나, nil을 주면 제거해요. 앞서와 마찬가지로 Ruby 코드에서 직접 설정하기보다 ruby -E로 올바른 default_internal을 지정해 시작하는 걸 권장해요.

  • find(string) → enc — 지정된 name으로 인코딩을 찾아요. name은 문자열이어야 해요.

    Encoding.find("US-ASCII")  #=> #<Encoding:US-ASCII>
    

    이 메서드가 받는 이름은 인코딩 이름과 별칭이며, 특수 별칭도 포함해요: "external"(기본 외부 인코딩), "internal"(기본 내부 인코딩), "locale"(로케일 인코딩), "filesystem"(파일시스템 인코딩). name에 해당하는 인코딩이 없으면 ArgumentError가 발생해요. 다만 Encoding.find("internal")만은 예외로, "internal"이라는 이름의 인코딩이 없을 때(즉 기본 내부 인코딩이 없을 때) nil을 돌려줘요.

  • list → [enc1, enc2, ...] — 로드된 인코딩 목록을 돌려줘요.

    Encoding.list
    #=> [#<Encoding:ASCII-8BIT>, #<Encoding:UTF-8>,
          #<Encoding:ISO-2022-JP (dummy)>]
    
    Encoding.find("US-ASCII")
    #=> #<Encoding:US-ASCII>
    
    Encoding.list
    #=> [#<Encoding:ASCII-8BIT>, #<Encoding:UTF-8>,
          #<Encoding:US-ASCII>, #<Encoding:ISO-2022-JP (dummy)>]
    
  • locale_charmap → string — 로케일 charmap 이름을 돌려줘요. 적절한 정보가 없으면 nil을 돌려줘요.

    Debian GNU/Linux
      LANG=C
        Encoding.locale_charmap  #=> "ANSI_X3.4-1968"
      LANG=ja_JP.EUC-JP
        Encoding.locale_charmap  #=> "EUC-JP"
    
    SunOS 5
      LANG=C
        Encoding.locale_charmap  #=> "646"
      LANG=ja
        Encoding.locale_charmap  #=> "eucJP"
    

    결과가 플랫폼에 크게 의존해요. 그래서 Encoding.find(Encoding.locale_charmap)가 오류를 낼 수도 있어요. 알 수 없는 로케일이어도 인코딩 객체가 필요하다면 Encoding.find("locale")를 쓰면 돼요.

  • name_list → ["enc1", "enc2", ...] — 사용 가능한 인코딩 이름 목록을 돌려줘요.

    Encoding.name_list
    #=> ["US-ASCII", "ASCII-8BIT", "UTF-8",
          "ISO-8859-1", "Shift_JIS", "EUC-JP",
          "Windows-31J",
          "BINARY", "CP932", "eucJP"]
    

인스턴스 메서드

  • ascii_compatible? → true or false — ASCII 호환 여부를 돌려줘요.

    Encoding::UTF_8.ascii_compatible?     #=> true
    Encoding::UTF_16BE.ascii_compatible?  #=> false
    
  • dummy? → true or false — 더미(dummy) 인코딩이면 true를 돌려줘요. 더미 인코딩은 문자 처리가 제대로 구현되지 않은 인코딩이에요. 상태를 가진(stateful) 인코딩에 쓰여요.

    Encoding::ISO_2022_JP.dummy?       #=> true
    Encoding::UTF_8.dummy?             #=> false
    
  • inspect → string — 프로그래머를 위한 인코딩 표현 문자열을 돌려줘요.

    Encoding::UTF_8.inspect       #=> "#<Encoding:UTF-8>"
    Encoding::ISO_2022_JP.inspect #=> "#<Encoding:ISO-2022-JP (dummy)>"
    
  • names → array — 인코딩의 이름과 별칭 목록을 돌려줘요.

    Encoding::WINDOWS_31J.names  #=> ["Windows-31J", "CP932", "csWindows31J", "SJIS", "PCK"]
    

출처: Ruby 4.0 API - Encoding