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
letter(bytes, 0x7e, 1)
elsif unicode == 0x3099
letter(bytes, 0x309b, 2)
elsif unicode == 0x309a
letter(bytes, 0x309c, 2)
elsif ((0xd800 <= unicode && unicode <= 0xdb7f) ||
(0xdb80 <= unicode && unicode <= 0xdbff) ||
(0xdc00 <= unicode && unicode <= 0xdfff) ||
(0xe000 <= unicode && unicode <= 0xf8ff))
bytes.each{|i| nonLetter([ i ], $CHAR_PERIOD) }
else
begin
Iconv.conv($outputCS, 'UTF-16BE', [ unicode ].pack('n'))
rescue
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);
letter(bytes, unicode, packed.size)
return
rescue Iconv::IllegalSequence, Iconv::InvalidCharacter
end
begin
packed = Iconv.conv('SHIFT_JIS', 'UTF-16BE', utf16bePacked);
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
bytes.each{|i| nonLetter([ i ], $CHAR_PERIOD) }
end
end