Powershell Core 7 顯然是原生無 BOM 的 UTF8,但當我javac在任何包含重音字符的 UTF8 源檔案上使用時,它的性能仍然與 Windows Powershell 完全相同:它.class使用 ANSI 字符編碼對檔案進行編碼。
例如,這個簡單的程式PremierProg.java:
public class PremierProg
{
public static void main( String[] args )
{
System.out.println("Je suis déterminé à apprendre comment coder.");
}
}
將被編譯,然后在以下輸出中執行pwsh:
Je suis déterminé ? apprendre 評論編碼器。
我可以很明顯地將-encoding "UTF-8"選項添加到我的javac通話中,但是跨平臺的意義不是不必做任何這些嗎?實際上更容易輸入wsl javac [MySource.java]并輸出正確的.class檔案。Windows 和 Ubuntu 端都安裝了相同版本的 openjdk。
Powershell 確實將檔案正確讀取為 UTF8 :
pwsh 讀取 utf-8
但仍然與javac使用 ANSI進行互動(即使像 bash 這樣的其他永久 utf8 原生 shell 沒有這個問題)。
有誰知道為什么 Powershell - 即使是跨平臺的 Core 版本 - 會這樣?我真的不想在 profile.ps1 檔案或 javac 呼叫中添加任何內容。我只想讓 UTF8 原生的東西完全按照這種方式行事。
目前,我讓我的學生運行 bash(通過 wsl)作為他們的默認 shell,這很好,但這個問題仍然困擾著我。我想了解發生了什么,如果解決方案完全合理,請修復它。
在 javac 呼叫中不想要 profile.ps1 檔案或額外引數的原因是因為這需要在禁用腳本的學校董事會控制的設備上運行,并且我正在與大多數新手程式員打交道。
uj5u.com熱心網友回復:
感謝@Slaw 對原始問題的評論,該解決方案實際上與 PowerShell 或任何其他控制臺無關,而是與平臺(Windows、MacOS、Linux)和 JDK 無關。
Java 18 實際上將不再默認為平臺字符集,而是默認為 UTF-8,因此最終將消除此問題。
與此同時,最好的解決方案似乎是-encoding UTF-8在javac通話中添加選項。學生可以通過使用箭頭從他們的歷史記錄中檢索更長的命令來節省時間,而不是每次需要編譯時都輸入它。這個解決方案在 Java 18 發布后仍然有用,因為它清晰明確,但代價是更長。
uj5u.com熱心網友回復:
補充你自己的答案:
Windows 10 提供了一個仍處于測驗階段的選項,可以在系統范圍內使用 UTF-8(意味著 OEM 和 ANSI 代碼頁都設定
65001為 UTF-8)。雖然激活此選項有可能使編碼問題消失 - 不僅是javac(它使用的活動 ANSI 代碼頁將有效地是 UTF-8),而且通常使用 PowerShell(見下文) - 它還有遠-達到后果 - 請參閱此答案。如果激活系統范圍的 UTF-8 支持不是一個選項,您可以通過為該硬編碼定義一個包裝函式來解決這個問題,同時通過 傳遞所有其他引數,并將其放置在您的檔案中,以便通過未來所有會話中的默認值:
javac-encoding utf8$PROFILE
function javac { javac.exe -encoding utf8 $args }
注意:函式比外部程式有更高的命令優先級,所以當你提交時javac,函式會被呼叫。如果您還想定義javac.exe為包裝器,則可以添加Set-Alias javac.exe javac,并將javac函式體重新定義為& (Get-Command -Type Application javac.exe) -encoding utf8 $args
另外注意的是 特定的PowerShell的字符編碼方面的考慮:
從 PowerShell (Core) 7.2 開始,不幸的是,PowerShell控制臺視窗仍然默認為系統的舊版OEM代碼頁,這反映在
chcp、 和 .NET[Console]::InputEncoding和的輸出中[Console]::OutputEncoding。如果給定的外部程式以不同的編碼(例如 UTF-8)輸出文本,則
[Console]::Encoding必須首先將其設定為該編碼,以便 PowerShell 正確解碼輸出。警告:編碼不匹配在直接顯示輸出中可能不會被注意到,但會在 PowerShell處理輸出時出現,例如通過管道發送、重定向到檔案或將其捕獲到變數中。
相反,
$OutputEncoding首選項變數決定了 PowerShell 使用什么編碼通過管道將資料發送到外部程式。遺憾的是,Windows PowerShell默認為 ASCII(!),任何非 ASCII 范圍的字符都會“有損”地轉碼為文字
?字符。PowerShell的(核心)7 現在更理智默認為UTF-8 -雖然,如上所述,在去-coding輸出它仍然默認為系統的OEM代碼頁。
有關PowerShell 編碼行為和輔助函式鏈接的更詳細討論,請參閱此答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/362652.html
標籤:爪哇 电源外壳 utf-8 安西 powershell-core
