最近开发java控制台项目由于用了第三方库必须使用utf字符当然在开发环境eclipse下显示是正常的
但是windows的控制台却是输出乱码
虽然不改
程序逻辑是正确
作为偏执狂还是翻阅了各种资料
网上各种文章不是用chcp改变控制台编码就是建议修改程序编码为GBK
参考了stackoverflow的一篇文章找到一种使用Windows内核API的方案
utfandwindowsconsole
核心是封装一个Console类
package demo;import comsunjnaNative;import comsunjnaPointer;import comsunjnaptrIntByReference;import comsunjnawinStdCallLibrary;/** * For unicode output on windows platform * * @author Sandy_Yin * */public class Console {private static Kernel INSTANCE = null;public interface Kernel extends StdCallLibrary {public Pointer GetStdHandle(int nStdHandle)public boolean WriteConsoleW(Pointer hConsoleOutput char[] lpBufferint nNumberOfCharsToWriteIntByReference lpNumberOfCharsWritten Pointer lpReserved)}static {String os = SystemgetProperty(osname)toLowerCase()if (osstartsWith(win)) {INSTANCE = (Kernel) NativeloadLibrary(kernel Kernelclass)}}public static void print(String message) {if (!prePrint(message))Systemoutprint(message)}protected static boolean prePrint(String message) {boolean successful = false;if (INSTANCE != null) {Pointer handle = INSTANCEGetStdHandle()char[] buffer = messagetoCharArray()IntByReference lpNumberOfCharsWritten = new IntByReference()successful = INSTANCEWriteConsoleW(handle buffer bufferlengthlpNumberOfCharsWritten null)}return successful;}public static void println(String message) {// from// utfandwindowsconsoleif (prePrint(message)) {Systemoutprintln()} else {Systemoutprintln(message)}}}
对输出进行测试使用命令java jar samplejar发现输出还是一样
添加命令行参数使用java Dfileencoding=utf jar samplejar就达到效果了
PS此方法还存在一些缺陷但并不是Console类造成的上图中测试前有一个空白的地方这是应为使用utf方式读入非UTF文件产生的在文件开始会出现 代码下载
/Files/anic/utfsample_sourcezip
/Files/anic/utfsample_runtimezip