查看Ruby的Base64.encode的源代碼,我無法確定在Base64中編碼該數據之前,將字符串轉換爲何種字符(如果有的話)。在Base64中編碼的Utf-8字符串將與在Base64中編碼的Utf-16字符串大不相同。 Ruby對此操作做出任何承諾嗎?使用Base64.encode時的Ruby字符編碼
回答
的fine manual已經這樣說的:
encode64(BIN)
返回Base64- bin的編碼版本。6.8:此方法與RFC 2045
科RFC 2045 6.8表示的規定。 Base64內容傳輸編碼
Base64內容傳輸編碼旨在表示任意序列的八位字節的形式,不需要人爲可讀。 [...]
使用US-ASCII的65個字符的子集,可以爲每個可打印字符表示6位。 (額外65th字符, 「=」,用於表示一個特殊的處理功能。)
所以Base64的編碼字節成ASCII。如果這些字節實際上代表一個UTF-8編碼字符串,那麼UTF-8字符串將被分解成單個字節,這些字節將被轉換爲Base64;例如,如果您使用的是UTF-8字符串'µ'
,那麼您將最終將字節0xc2
和0xb5
(按此順序)編碼爲Base64表示"wrU=\n"
。如果你從一個二進制字符串"\xc2\xb5"
(它恰好與'µ'
的UTF-8版本匹配)開始,那麼你將得到相同的"wrU=\n"
輸出。
當你解碼"wrU=\n"
時,你會得到字節"\xc2\xb5"
,你必須知道那些字節應該是UTF-8編碼的文本而不是一些任意的位。這就是爲什麼您將獨立的內容類型和字符集元數據附加到Base64上的原因。
同樣,如果你有一個UTF-16字符串,那麼它將被分解成字節,這些字節將被編碼,就像任何其他字節字符串。當然,由於字節順序問題,這種情況會稍微複雜一點,但這就是我們爲什麼有內容類型和字符集標題以及物料清單的原因。
重點是Base64與字節一起使用,而不是字符。什麼格式(UTF-8文本,UTF-16文本,PNG圖像......)是別人的問題。 Base64只是將一個字節流轉換爲US ASCII的一個子集,然後返回字節;這些字節的格式必須單獨指定。
我在源代碼中做了一些動作,結果可能是有趣的,即使它們不完全相關。該encode64
method很簡單:
def encode64(bin)
[bin].pack("m")
end
然後,如果你去翻Array#pack
:
static VALUE
pack_pack(VALUE ary, VALUE fmt)
{
/*...*/
int enc_info = 1; /* 0 - BINARY, 1 - US-ASCII, 2 - UTF-8 */
,並留意enc_info
,你會看到一個'm'
格式將獨自離開enc_info
所以包裝繩將作爲US-ASCII出現,所以encode64
將按預期產生美國ASCII輸出。
一個例子進行編碼和解碼以base64的UTF-8字符串:
text = "intérnalionálização"
=> "intérnalionálização"
text.encoding
=> #<Encoding:UTF-8>
encoded = Base64.encode64(text)
=> "aW50w6lybmFsaW9uw6FsaXphw6fDo28=\n"
encoded.encoding
=> #<Encoding:US-ASCII>
decoded = Base64.decode64(encode)
=> "int\xC3\xA9rnalion\xC3\xA1liza\xC3\xA7\xC3\xA3o"
decoded.encoding
=> #<Encoding:US-ASCII>
decoded = decoded.force_encoding('UTF-8')
=> "intérnalionálização"
decoded.encoding
=> #<Encoding:UTF-8>
- 1. encode-decode base64字符串AngularJS1 TypeScript?
- 2. 使用base64編碼字符串URL
- 3. Base64編碼:非法base64字符3c
- 4. 從Base64編碼字符串
- 5. MIME Base64編碼寬字符
- 6. java字符串base64編碼
- 7. Java Base64編碼的字符串與.NET Base64編碼的字符串
- 8. 爲什麼base64編碼的字符串使用字符+和/?
- 9. 解碼編碼的base64字符串
- 10. 的Python:解碼base64編碼字符串
- 11. wp.uploadFile xmlrpc python encode base64
- 12. C#到Ruby sha1 base64編碼
- 13. Base64編碼的字符串到文件(Ruby on Rails)
- 14. 字符集編碼問題 - Base64編碼爲GB2312爲Base64
- 15. 如何解碼使用base64編碼的圖像字符串
- 16. 解碼Base64編碼字符串
- 17. Ruby中的字符編碼
- 18. Base64編碼的InputStream字符串
- 19. Android的Base64編碼字符串檢測
- 20. PHP的Base64鹽字符串編碼
- 21. ArrayBuffer以base64編碼的字符串
- 22. Base64中的日文字符編碼
- 23. Base64編碼的字符串到文件
- 24. 如何使用GWT將短字符串編碼/解碼爲Base64?
- 25. 使用Base64編碼的JsonResult
- 26. Ruby 1.8.7中的Ruby字符串編碼
- 27. 使用NSJSONSerialization編碼的Base64字符串被反斜槓轉義
- 28. 安卓:使用的Base64到圖像編碼爲字符串
- 29. 不使用「+/=」(加號或等號)字符的base64編碼?
- 30. 標記使用base64編碼的字符串
這與我在維克托答案評論中的懷疑一致。感謝您的確認。 – Brent