熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

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

2022-06-13   來源: Java核心技術 

  最近開發java控制台項目由於用了第三方庫必須使用utf字符當然在開發環境eclipse下顯示是正常的

  image 

  但是windows的控制台卻是輸出亂碼

  image 

    雖然不改程序邏輯是正確作為偏執狂還是翻閱了各種資料
   
   
   
   
   
    網上各種文章不是用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發現輸出還是一樣image
添加命令行參數使用java Dfileencoding=utf jar samplejar就達到效果了
image
PS此方法還存在一些缺陷但並不是Console類造成的上圖中測試前有一個空白的地方這是應為使用utf方式讀入非UTF文件產生的在文件開始會出現 代碼下載
/Files/anic/utfsample_sourcezip
/Files/anic/utfsample_runtimezip


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25701.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.