Clear some confusion between MemoryView and bytes in codecs

When we use bytes.decode() then `input` will be a `bytes` but
when we use file.open(path, encoding='tcvn3') then `input` is
a `MemoryView`.
Add tests for charset converter
Integrate vncharsets into the GUI tool