Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UTF-8字母显示不正确_Java_Windows_Utf 8_Cmd_Apache Drill - Fatal编程技术网

Java UTF-8字母显示不正确

Java UTF-8字母显示不正确,java,windows,utf-8,cmd,apache-drill,Java,Windows,Utf 8,Cmd,Apache Drill,我在dos提示符下使用ApacheDrill在Windows10上查询json格式的数据。我正在关注他们的观点 我有一个非常基本的json对象{“år”:“2018”,“æå”:“ÆØ”},当我从apache drill查询它时,输出没有正确显示 select * from dfs.`C:\Users\foo\Downloads\utf8.json`; +-------+------+ | Õr | µ°Õ | +-------+------+ | 2018 | ãÏ┼ | +---

我在dos提示符下使用ApacheDrill在Windows10上查询json格式的数据。我正在关注他们的观点

我有一个非常基本的json对象
{“år”:“2018”,“æå”:“ÆØ”}
,当我从apache drill查询它时,输出没有正确显示

select * from dfs.`C:\Users\foo\Downloads\utf8.json`;
+-------+------+
|  Õr   | µ°Õ  |
+-------+------+
| 2018  | ãÏ┼  |
+-------+------+
1 row selected (0,114 seconds)
文件以UTF-8格式保存(使用升华文本)。我也试着用BOM将其保存在UTF-8中,但没有什么不同

使用SO线程设置环境变量,如中所述

set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8
没有帮助

编辑:

发布后,我发现一个SO线程,建议windows代码页使用65001(utf-8)。这会显示正确的字母,但也会阻止命令历史记录(向上箭头)正常工作

chcp 65001
sqlline.bat -u "jdbc:drill:zk=local"
select * from dfs.`C:\Users\cgu\Downloads\utf8.json`;
+-------+------+
|  år   | æøå  |
+-------+------+
| 2018  | ÆØÅ  |
+-------+------+

您正在使用Windows控制台。ApacheDrill显然有一个基于控制台的可执行文件,它与cmdshell无关,只是使用了一些方便的批处理脚本(sqlline.bat)。控制台本机是UTF-16(即基于
wchar\u t
),但跨平台项目通常使用其传统的基于
char
的API,该API使用代码页。您已经发现UTF-8的代码页65001。如果您使用的是Windows 8+,这对UTF-8输出效果很好。它在旧版本中存在缺陷,即使在Windows 10中,它也会因非ASCII输入而中断(即,仅限于前128个Unicode字符)。如果您失去对命令历史记录的访问,那么连接到控制台的进程可能比其历史缓冲区的多。每个人都有自己的历史。打开“控制台属性”对话框,将历史缓冲区的数量增加到32。@eryksun感谢您的建议。增加hist.buffers会有所帮助。最后,我在win10中安装了linux子系统,安装ubuntu时使用的是(不能在工作时使用MS Store),这给了我一个更熟悉的工作环境。我发现linux子系统(WSL)使用相同的控制台后端(conhost.exe通过condrv.sys驱动程序),但显然,通过不同的内部API,将非ASCII输入读取为UTF-8是没有问题的。相反,当与Windows应用程序对话时(例如,通过
ReadFile
ReadConsoleA
),当控制台输入代码页为65001时,同一控制台后端会用NUL(\x00”)替换所有非ASCII字符。通过将调试器附加到conhost.exe,我知道发生这种情况是因为错误地假设代码页是固定大小的编码(通常为单字节),而UTF-8使用1-4字节。但我不明白为什么他们只为WSL而不是Windows API修复它。我想他们有自己的优先权。