# File hexja, line 740
  def unicodeLetter(bytes, unicode)
    if unicode <= 0x1f
      nonLetter(bytes, unicode + $CHAR_AT)
    elsif unicode == 0x7f
      nonLetter(bytes, $CHAR_QUESTION)
    elsif unicode <= 0x7f
      letter(bytes, unicode, 1)
    elsif unicode == 0x203e
      # SHIFT_JIS の 0x7e は U+203e になってしまうが、
      # U+203e はワイド幅なので都合が悪いので変更する
      letter(bytes, 0x7e, 1)
    elsif unicode == 0x3099
      # U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK (濁点)
      letter(bytes, 0x309b, 2) # U+309B KATAKANA-HIRAGANA VOICED SOUND MARK
    elsif unicode == 0x309a
      # U+309a COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK (半濁点)
      letter(bytes, 0x309c, 2)
      # U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
    elsif ((0xd800 <= unicode && unicode <= 0xdb7f) || # High Surrogates
           (0xdb80 <= unicode && unicode <= 0xdbff) || # High Private Use Surrogates
           (0xdc00 <= unicode && unicode <= 0xdfff) || # Low Surrogates
           (0xe000 <= unicode && unicode <= 0xf8ff)) # Private Use Area
      bytes.each{|i| nonLetter([ i ], $CHAR_PERIOD) }
    else
      # この文字が、$outputCS 文字コードで出力可能かどうかを調査
      begin
        Iconv.conv($outputCS, 'UTF-16BE', [ unicode ].pack('n'))
      rescue
        # U+ff5e FULLWIDTH TILDE → U+301C WAVE DASH
        if unicode == 0xff5e
          unicode = 0x301c 
          retry
        end
        # 失敗したから…
        bytes.each{|byte| nonLetter([ byte ], $CHAR_PERIOD)}
        return
      end

      # 文字幅を調査する
      
      utf16bePacked = [ unicode ].pack('n')
      begin
        packed = Iconv.conv('CP932', 'UTF-16BE', utf16bePacked);
        # SJISでは、画面に表示される文字の幅は、バイト数に一致する
        # FIXME: せっかくUNICODEなので、
        # SJISチェックをしないバージョンも作りたい
        letter(bytes, unicode, packed.size)
        return
      rescue Iconv::IllegalSequence, Iconv::InvalidCharacter
      end
      
      begin
        packed = Iconv.conv('SHIFT_JIS', 'UTF-16BE', utf16bePacked);
        # SJISでは、画面に表示される文字の幅は、バイト数に一致する
        # FIXME: せっかくUNICODEなので、
        # SJISチェックをしないバージョンも作りたい
        letter(bytes, unicode, packed.size)
        return
      rescue Iconv::IllegalSequence, Iconv::InvalidCharacter
      end
      
      begin
        packed = Iconv.conv($iso2022jp1, 'UTF-16BE', utf16bePacked);
        letter(bytes, unicode, 1 < packed.size ? 2 : 1)
        return
      rescue Iconv::IllegalSequence, Iconv::InvalidCharacter
      end
      
      begin
        packed = Iconv.conv('EUC-JP', 'UTF-16BE', utf16bePacked);
        if packed.size == 1 || ord(packed[0]) == 0x8e
          size = 1
        else
          size = 2
        end
        letter(bytes, unicode, size)
        return
      rescue Iconv::IllegalSequence, Iconv::InvalidCharacter
      end
      
      # Iconv::IllegalSequence: 変換できなかった場合
      # Iconv::InvalidCharacter: サローゲートペアの片割れなど
      bytes.each{|i| nonLetter([ i ], $CHAR_PERIOD) }
    end
  end