class PDF::Reader::Encoding::MacExpertEncoding

def to_utf8(str, tounicode = nil)

convert a MacExpertEncoding string into UTF-8
def to_utf8(str, tounicode = nil)
  array_expert = str.unpack('C*')
  array_expert = self.process_differences(array_expert)
  array_enc = []
  array_expert.each do |num|
    if tounicode && (code = tounicode.decode(num))
      array_enc << code
    elsif tounicode
      array_enc << PDF::Reader::Encoding::UNKNOWN_CHAR
    else
      case num
        # change necesary characters to equivilant Unicode codepoints
      when 0x21; array_enc << 0xF721
      when 0x22; array_enc << 0xF6F8 # Hungarumlautsmall
      when 0x23; array_enc << 0xF7A2
      when 0x24; array_enc << 0xF724
      when 0x25; array_enc << 0xF6E4
      when 0x26; array_enc << 0xF726
      when 0x27; array_enc << 0xF7B4
      when 0x28; array_enc << 0x207D
      when 0x29; array_enc << 0xF07E
      when 0x2A; array_enc << 0x2025
      when 0x2B; array_enc << 0x2024
      when 0x2F; array_enc << 0x2044
      when 0x30; array_enc << 0xF730
      when 0x31; array_enc << 0xF731
      when 0x32; array_enc << 0xF732
      when 0x33; array_enc << 0xF733
      when 0x34; array_enc << 0xF734
      when 0x35; array_enc << 0xF735
      when 0x36; array_enc << 0xF736
      when 0x37; array_enc << 0xF737
      when 0x38; array_enc << 0xF738
      when 0x39; array_enc << 0xF739
      when 0x3D; array_enc << 0xF6DE
      when 0x3F; array_enc << 0xF73F
      when 0x44; array_enc << 0xF7F0
      when 0x47; array_enc << 0x00BC
      when 0x48; array_enc << 0x00BD
      when 0x49; array_enc << 0x00BE
      when 0x4A; array_enc << 0x215B
      when 0x4B; array_enc << 0x215C
      when 0x4C; array_enc << 0x215D
      when 0x4D; array_enc << 0x215E
      when 0x4E; array_enc << 0x2153
      when 0x4F; array_enc << 0x2154
      when 0x56; array_enc << 0xFB00
      when 0x57; array_enc << 0xFB01
      when 0x58; array_enc << 0xFB02
      when 0x59; array_enc << 0xFB03
      when 0x5A; array_enc << 0xFB04
      when 0x5B; array_enc << 0x208D
      when 0x5D; array_enc << 0x208E
      when 0x5E; array_enc << 0xF6F6
      when 0x5F; array_enc << 0xF6E5
      when 0x60; array_enc << 0xF760
      when 0x61; array_enc << 0xF761
      when 0x62; array_enc << 0xF762
      when 0x63; array_enc << 0xF763
      when 0x64; array_enc << 0xF764
      when 0x65; array_enc << 0xF765
      when 0x66; array_enc << 0xF766
      when 0x67; array_enc << 0xF767
      when 0x68; array_enc << 0xF768
      when 0x69; array_enc << 0xF769
      when 0x6A; array_enc << 0xF76A
      when 0x6B; array_enc << 0xF76B
      when 0x6C; array_enc << 0xF76C
      when 0x6D; array_enc << 0xF76D
      when 0x6E; array_enc << 0xF76E
      when 0x6F; array_enc << 0xF76F
      when 0x70; array_enc << 0xF770
      when 0x71; array_enc << 0xF771
      when 0x72; array_enc << 0xF772
      when 0x73; array_enc << 0xF773
      when 0x74; array_enc << 0xF774
      when 0x75; array_enc << 0xF775
      when 0x76; array_enc << 0xF776
      when 0x77; array_enc << 0xF777
      when 0x78; array_enc << 0xF778
      when 0x79; array_enc << 0xF779
      when 0x7A; array_enc << 0xF77A
      when 0x7B; array_enc << 0x20A1
      when 0x7C; array_enc << 0xF6DC
      when 0x7D; array_enc << 0xF6DD
      when 0x7E; array_enc << 0xF6FE
      when 0x81; array_enc << 0xF6E9
      when 0x82; array_enc << 0xF6E0
      when 0x87; array_enc << 0xF7E1 # Acircumflexsmall
      when 0x88; array_enc << 0xF7E0
      when 0x89; array_enc << 0xF7E2 # Acutesmall
      when 0x8A; array_enc << 0xF7E4
      when 0x8B; array_enc << 0xF7E3
      when 0x8C; array_enc << 0xF7E5
      when 0x8D; array_enc << 0xF7E7
      when 0x8E; array_enc << 0xF7E9
      when 0x8F; array_enc << 0xF7E8
      when 0x90; array_enc << 0xF7E4
      when 0x91; array_enc << 0xF7EB
      when 0x92; array_enc << 0xF7ED
      when 0x93; array_enc << 0xF7EC
      when 0x94; array_enc << 0xF7EE
      when 0x95; array_enc << 0xF7EF
      when 0x96; array_enc << 0xF7F1
      when 0x97; array_enc << 0xF7F3
      when 0x98; array_enc << 0xF7F2
      when 0x99; array_enc << 0xF7F4
      when 0x9A; array_enc << 0xF7F6
      when 0x9B; array_enc << 0xF7F5
      when 0x9C; array_enc << 0xF7FA
      when 0x9D; array_enc << 0xF7F9
      when 0x9E; array_enc << 0xF7FB
      when 0x9F; array_enc << 0xF7FC
      when 0xA1; array_enc << 0x2078
      when 0xA2; array_enc << 0x2084
      when 0xA3; array_enc << 0x2083
      when 0xA4; array_enc << 0x2086
      when 0xA5; array_enc << 0x2088
      when 0xA6; array_enc << 0x2087
      when 0xA7; array_enc << 0xF6FD
      when 0xA9; array_enc << 0xF6DF
      when 0xAA; array_enc << 0x2082
      when 0xAC; array_enc << 0xF7A8
      when 0xAE; array_enc << 0xF6F5
      when 0xAF; array_enc << 0xF6F0
      when 0xB0; array_enc << 0x2085
      when 0xB2; array_enc << 0xF6E1
      when 0xB3; array_enc << 0xF6E7
      when 0xB4; array_enc << 0xF7FD
      when 0xB6; array_enc << 0xF6E3
      when 0xB9; array_enc << 0xF7FE
      when 0xBB; array_enc << 0x2089
      when 0xBC; array_enc << 0x2080
      when 0xBD; array_enc << 0xF6FF
      when 0xBE; array_enc << 0xF7E6 # AEsmall
      when 0xBF; array_enc << 0xF7F8
      when 0xC0; array_enc << 0xF7BF
      when 0xC1; array_enc << 0x2081
      when 0xC2; array_enc << 0xF6F9
      when 0xC9; array_enc << 0xF7B8
      when 0xCF; array_enc << 0xF6FA
      when 0xD0; array_enc << 0x2012
      when 0xD1; array_enc << 0xF6E6
      when 0xD6; array_enc << 0xF7A1
      when 0xD8; array_enc << 0xF7FF
      when 0xDA; array_enc << 0x00B9
      when 0xDB; array_enc << 0x00B2
      when 0xDC; array_enc << 0x00B3
      when 0xDD; array_enc << 0x2074
      when 0xDE; array_enc << 0x2075
      when 0xDF; array_enc << 0x2076
      when 0xE0; array_enc << 0x2077
      when 0xE1; array_enc << 0x2079
      when 0xE2; array_enc << 0x2070
      when 0xE4; array_enc << 0xF6EC
      when 0xE5; array_enc << 0xF6F1
      when 0xE6; array_enc << 0xF6F3
      when 0xE9; array_enc << 0xF6ED
      when 0xEA; array_enc << 0xF6F2
      when 0xEB; array_enc << 0xF6EB
      when 0xF1; array_enc << 0xF6EE
      when 0xF2; array_enc << 0xF6FB
      when 0xF3; array_enc << 0xF6F4
      when 0xF4; array_enc << 0xF7AF
      when 0xF5; array_enc << 0xF6EF
      when 0xF6; array_enc << 0x207F
      when 0xF7; array_enc << 0xF6EF
      when 0xF8; array_enc << 0xF6E2
      when 0xF9; array_enc << 0xF6E8
      when 0xFA; array_enc << 0xF6F7
      when 0xFB; array_enc << 0xF6FC
      else
        array_enc << num
      end
    end
  end
  # convert any glyph names to unicode codepoints
  array_enc = self.process_glyphnames(array_enc)
  # replace charcters that didn't convert to unicode nicely with something valid
  array_enc.collect! { |c| c ? c : PDF::Reader::Encoding::UNKNOWN_CHAR }
  # pack all our Unicode codepoints into a UTF-8 string
  ret = array_enc.pack("U*")
  # set the strings encoding correctly under ruby 1.9+
  ret.force_encoding("UTF-8") if ret.respond_to?(:force_encoding)
  return ret
end