2015-07-11 78 views
0

以下內容均在標準控制檯以及Powershell ISE下使用包含經過測試的unicode代碼點的字體在PowerShell 3.0中運行。C#和Java控制檯編碼和PowerShell

下面的C#程序正確打印~(所以我們知道它可以工作):

static void Main(string[] args) 
{ 
    Console.WriteLine("\u2248"); 
} 

在一個旁註,當我看着Console.OutputEncoding它聲稱是代碼頁IBM850這當然不可能是真的。即使更奇怪的是獨立於我設置的控制檯的代碼頁(使用chcp)的輸出是好的,所以.NET不得不擔心編碼本身(或調用一些特殊的API?)

現在,當我嘗試下面的Java程序我結束了混亂的輸出( "H):

public static void main(String[] args) throws UnsupportedEncodingException { 
    System.out.println("\u2248"); 
} 

現在,是因爲Java着眼於系統編碼並使用,這將是Windows的1252,所以這是符合市場預期,但以下也不起作用:

public static void main(String[] args) throws UnsupportedEncodingException { 
    new PrintStream(System.out, true, "UTF-16").println("\u2248"); 
} 

我的可以做的是事先使用UTF-8並調用chcp 65001。此工作,然後顯示正確的標誌符號,有一個錯誤,其中一些字符在行的末尾重複:打印\u2248weird.結果在≈weird.d.所以這也不是很好。

那麼C#使用什麼編碼來寫入控制檯,或者更一般地說,我如何讓Java在PowerShell中正確輸出Unicode呢?

+0

您是否在設置運行'java -Dfile.encoding = UTF-8'的'chcp 65001'並使用'System.out。println()'而不是通過'PrintStream'創建一個'PrintStream'? – RealSkeptic

+0

@RealSkeptic這是我如何使現有的jar文件正常工作而不必更改代碼(所以我希望它只是我需要的編碼而不是一些奇怪的Win32 API調用)的實際計劃。它的行爲與使用PrintStream的方式完全相同。 – Voo

+0

對這[[答案](http://stackoverflow.com/a/388500/4125191)的評論可能會幫助你理解錯誤發生的原因。抱歉,我沒有解決方案,但。可能嘗試使用utf-16的1200或1201。 – RealSkeptic

回答

2

什麼編碼是利用寫入到控制檯

無,.NET被使用Win32 API WriteConsoleW至(井,UTF-16代碼單元)直接寫字符C#。沒有編碼/從字節解碼的步驟,所以控制檯的代碼頁是不相關的。 (是的,850是西歐預期的代碼頁。)

其他應用程序和語言(包括Java)正在使用C標準庫IO函數,這些函數以字節爲單位進行處理,因此涉及編碼解碼階段,控制檯代碼頁。

我能做的就是事先使用UTF-8並調用chcp 65001。這工作,然後會顯示正確的字形,但其中一些字符重複

這是Windows的命令行支持代碼頁65001通常代碼頁65001是一套長期的錯誤的部分錯誤由於這個原因,沒有一種可行的方式讓C-stdlib應用程序在控制檯上支持Unicode。

通常沒有純粹的跨平臺方式來編寫支持Unicode的命令行應用程序。您必須檢測到您已連接到面向角色的控制檯(而不是面向字節的管道)並在Windows上運行,並且在此情況下,需要調用Win32 WriteConsoleW。使用JNA的Example