java

位置:IT落伍者 >> java >> 浏览文章

用java在Windows控制台输出utf8字符


发布日期:2019年12月31日
 
用java在Windows控制台输出utf8字符

最近开发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(osnametoLowerCase()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

               

上一篇:使用Java控制UDP协议

下一篇:struts2与freemarker的集成