Java JLine的编码问题

Java JLine的编码问题,java,unicode,encoding,console,jline3,Java,Unicode,Encoding,Console,Jline3,是一个模块,用于在用户按下Enter之前在控制台截取用户输入。它使用JNA或类似的魔法 我正在用它做一些实验,当我输入更多的“奇异”Unicode字符时,我会遇到编码问题。这里的操作系统是W10,我用的是Cygwin。这在Groovy中也是如此,但对Java用户来说应该是显而易见的 def terminal = org.jline.terminal.TerminalBuilder.builder().jna( true ).system( true ).build() terminal.ente

是一个模块,用于在用户按下
Enter
之前在控制台截取用户输入。它使用JNA或类似的魔法

我正在用它做一些实验,当我输入更多的“奇异”Unicode字符时,我会遇到编码问题。这里的操作系统是W10,我用的是Cygwin。这在Groovy中也是如此,但对Java用户来说应该是显而易见的

def terminal = org.jline.terminal.TerminalBuilder.builder().jna( true ).system( true ).build()
terminal.enterRawMode()
// NB the Terminal I get is class org.jline.terminal.impl.PosixSysTerminal
def reader = terminal.reader()

def bytes = [] // NB class ArrayList
int readInt = -1
while( readInt != 13 && readInt != 10 ) {
    readInt = reader.read()
    byte convertedByte = (byte)readInt
    // see what the binary looks like:
    String binaryString = String.format("%8s", Integer.toBinaryString( convertedByte & 0xFF)).replace(' ', '0')
    println "binary |$binaryString|"
    bytes << (byte)readInt // NB means "append to list"
    println ">>> read |$readInt| byte |$convertedByte|"
}
// strip final byte (13 or 10)
bytes = bytes[0..-2]
println "z bytes $bytes, class ${bytes.class.name}"
def response = new String( (byte[])bytes.toArray(), 'UTF-8' )
// to get proper out encoding for Cygwin I then need to do this (I have no idea why!)
def psOut = new PrintStream(System.out, true, 'UTF-8' )
psOut.print( "using PrintStream: |$response|" )
实际上,输入时输出的二进制文件“ẃ" is 11100001:10111010:10010010

这将转换为U+1E92,这是另一个波兰字符,”Ẓ“。这确实是
响应
字符串
中打印出来的内容


不幸的是,JLine软件包给了您这个
阅读器
,它是class
org.JLine.utils.NonBlocking$NonBlockingInputStreamReader
…所以我真的不知道我能做些什么来调查它的编码(我假设是UTF-8)或者以某种方式修改它……有人能解释问题是什么吗?

据我所知,这与一年前被问及的Cygwin特定问题有关

有一个解决方案,对于我在这之后直接提出的问题…它正确地处理Unicode输入,即使在基本的多语言平面之外,使用JLine…和Cygwin控制台…希望如此

ẃ --> Unicode U+1E83 
    UTF-8 HEX: 0xE1 0xBA 0x83 (e1ba83) 
    BINARY: 11100001:10111010:10000011