The problem occurs when sending keyboard input to terminalPrivate API.
In Terminal.prototype.onVTKeystroke the keystroke is UTF8 encoded (because keyboard.characterEncoding is set to 'utf-8') before passing it to io.onVTKeystroke implementation, which calls chrome.terminalPrivate.sendInput. The problem is that the extension system expects UTF16 string and it encodes the received string to UTF8 (again) before SendInput extension function implementation receives it.
So, e.g. for 'č' (0xc4 0x8d in UTF8) becomes 0xc3 0x84 0xc20 x8d, because 0xc4 UTF16 is 0xc3 0x84 UTF8 and 0x8d UTF16 is 0xc2 0x8d UTF8.
When the input is echoed back, crosh extension API converts UTF8 passed from crosh process to UTF16 and we get 0xc4 0x8d UTF16; or Ä [a control character].
Maybe we should force keyboard.characterEncoding value to be 'raw' for crosh?