2014-03-31 200 views
1

SGVsbG8sIHdvcmxkIQ ==我必須編寫兩個腳本,一個用於Windows Server,另一個用於Ubuntu Server。爲了說明這一點,如果我的bash腳本運行:Powershell ToBase64String與Linux之間的不同輸出base64

echo -n 'BASE64' | base64 

結果是QkFTRTY0。如果我的PowerShell腳本運行:

[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes('BASE64')) 

結果是QgBBAFMARQA2ADQA。重要的是在Linux中獲得相同的PowerShell字符串。任何人都知道爲什麼這種差異和解決我的問題?我認爲這個問題與Unix的UTF-8編碼有關,但我找不到解決方案。我可以解碼Linux中的PowerShell輸出,但是我無法在Linux中編碼字符串,並得到與PowerShell相同的結果。 bash解決方案是最佳的,但C/C++代碼解決方案或指南也可以工作。

+0

如果你做'[System.Convert] :: ToBase64String([System.Text.Encoding] :: UTF8.GetBytes('BASE64'))''? –

+0

@ScottChamberlain,我必須在Linux中得到'Unicode.GetBytes'的相同結果。 – 1e100

+0

因爲Linux使用utf8,所以你不能使它相同,並且你迫使Unicode,因此它有兩個不同的字節數組。爲什麼你需要強制Unicode編碼,使用'UTF8.GetBytes'返回正確的結果。 –

回答

3

您需要使用iconv

$ echo -n 'BASE64' | iconv -f UTF8 -t UTF16LE | base64 
QgBBAFMARQA2ADQA 

UTF16LE使其忽略BOM。

請參閱https://superuser.com/q/381056/4206,其中有人詢問強制包含BOM,但您希望得到相反的結果,這很方便 - 就是問題所在。

+0

工程就像一個魅力。我是一個快樂的人。 – 1e100

+0

使用OSX'iconv'支持的編碼開關是'UTF-16LE'。 FWIW! –

相關問題