我的頭發都變白了。我需要將 PowerShell 中的字串轉換為 UTF-8。我的參考代碼是用 Java 撰寫的(并且可以與更大的應用程式一起作業),所以我需要重現它的作用。
在Java中,我這樣做:
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j ) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
public static void main(String[] args) throws Exception {
System.out.println(bytesToHex("a??".getBytes("UTF8")));
}
哪個輸出61C3B6C39F。
在 PowerShell 中,我做
Write-Output $(([System.Text.UTF8Encoding]::New($false, $true).getBytes("a??") | ForEach-Object ToString X2) -join '')
哪個輸出 61C383C2B6C383C5B8
為什么它們不同?如何使 PowerShell 編碼與 Java 匹配?
我將非常感謝任何見解!
最佳 eDude
編輯:好的,現在我更困惑了。在 PowerShell 5.1 控制臺中運行上述命令時,它按預期作業。將其放入腳本檔案并執行時,它不會。
編輯 2:更多資訊,如果腳本檔案以 UTF-8 編碼保存,則會出現錯誤。如果它以另一種編碼方式保存(例如 Notepad 的 ANSI),它可以作業。為什么腳本檔案的編碼會改變腳本本身的行為?如何防止這種情況并確保獲得一致的結果?
uj5u.com熱心網友回復:
嘗試將您的腳本檔案轉換為UTF-8-BOMNotepad 中的編碼并運行它。PowerShell 5 的默認編碼是Western European (Windows)( windows-1252),因此當您的腳本檔案中沒有 BOM 時,它會將其讀取為 UTF-16,因此是雙長度字串。
PowerShell 7 中的默認編碼是UTF-8,所以應該不是問題。
您可以檢查不同 powershell 版本的默認編碼,如下所示:
PS> [System.Text.Encoding]::Default
您還可以指定所需的字符以避免在沒有 BOM 的檔案中出現此問題:
$str = [char]0x0061 [char]0x00F6 [char]0x00DF
Write-Output $(([System.Text.Encoding]::UTF8.GetBytes($str) | ForEach-Object ToString X2) -join '')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/405520.html
標籤:
