Ruby's Base64.encode kaynağına bakarak Bir dizeyi kodlayan karakterin, Base64'te bu veriyi kodlamadan önce dönüştürülmediğini belirleyemiyorum. Base64'te kodlanmış bir Utf-8 dizesi, Base64'te kodlanmış bir Utf-16 dizgisinden çok farklı olacaktır. Ruby bu operasyonla ilgili herhangi bir söz veriyor mu? kodlamak ve base64 bir utf-8 dize çözmek içinBase64.encode'u kullanırken Ruby karakter kodlaması
cevap
fine manual bunu söylemek etti:
encode64 (bin)
Base64- İade bin kodlanmış sürümü.6,8: Bu yöntem RFC 2045.
Bölüm RFC 2045 6.8 diyor uymaktadır. Base64 Content-Transfer-Kodlama
Base64 İçerik Aktarımı Kodlama, oktetlerin isteğe bağlı sekanslarını insanca okunabilir olmayan bir biçimde temsil edecek şekilde tasarlanmıştır. [...]
Yazdırılabilir karakter başına 6 bitin gösterilmesini sağlayan 65 karakterlik bir US-ASCII alt kümesi kullanılır. (Ekstra 65 karakter, "=", özel bir işleme fonksiyonunu belirtmek için kullanılır.)
Yani Base64 ASCII içine bayt kodlar. Bu bayt aslında bir UTF-8 kodlanmış dizeyi temsil ediyorsa, UTF-8 dizesi tek tek baytlara bölünür ve bu baytlar Base64'e dönüştürülür; Örneğin, bir UTF-8 dizginiz 'µ'
varsa, 0xc2
ve 0xb5
baytlarını (bu sırayla) Base64 gösterimi "wrU=\n"
'a kodlamaktan sonlanırsınız. "\xc2\xb5"
('µ'
'un UTF-8 sürümü ile eşleşecek şekilde) bir ikili dize ile başlarsanız, aynı "wrU=\n"
çıktısını alırsınız.
Eğer "wrU=\n"
deşifre
"\xc2\xb5"
alırsınız ve bu bayt UTF-8 kodlu metin yerine bit bazı keyfi damla gerekiyordu olduğunu bilmek gerekir. Bu nedenle, Base64'e eklenmiş ayrı içerik türü ve karakter kümesi meta verileriniz vardır.
Benzer şekilde, eğer bir UTF-16 dizginiz varsa, bu baytlara bölünür ve bu baytlar diğer bayt dizgileri gibi kodlanır. Tabii ki bu durum bayt düzeniyle ilgili sorunlardan dolayı biraz daha karmaşıktır, ancak bu nedenle içerik türü ve karakter kümesi üstbilgileri ve BOM'lar vardır.
Ana nokta, Base64'ün bayt ile karakterlerin değil, çalıştığıdır. Hangi format (UTF-8 metin, UTF-16 metni, PNG görüntüsü, ...) başkasının problemidir. Base64 sadece bir bayt akışını ABD ASCII'nin bir alt kümesine ve daha sonra baytlara dönüştürür; Bu baytların formatı ayrıca belirtilmelidir.
Bazı kaynağı çevresinde alay ve onlar tamamen alakalı olmasa bile sonuç ilginç olabilecek yaptı.Eğer
Array#pack
bakmak Sonra
def encode64(bin)
[bin].pack("m")
end
:
static VALUE
pack_pack(VALUE ary, VALUE fmt)
{
/*...*/
int enc_info = 1; /* 0 - BINARY, 1 - US-ASCII, 2 - UTF-8 */
ve enc_info
göz kulak Eğer bir 'm'
biçim dolu dize kadar yalnız enc_info
bırakacağını göreceksiniz encode64
method basitçe şudur US-ASCII olarak çıkacak ve encode64
beklendiği gibi ABD ASCII çıkışı üretecektir.
Bir örnek:
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>
İlginç. Decode64'den döndürülen dize US-ASCII'dir ve bir kaç kaçış karakter içerir. Sanırım, bunu base64 kodlamadan önce US-ASCII'ye çevirdiği oldukça iyi bir gösterge. – Brent
Anlamak için: http://api.rubyonrails.org/classes/Base64.html ve http://apidock.com/ruby/Array/pack –
Victor'un kodunu irb oturumunda denemek istiyorsanız, emin olun İlk önce 'base64' gerektirir. – Gokul
- 1. Outlook'la Emacs'i kullanırken karakter kodlaması dönüştürme hatası
- 2. Freemarker şablonunda base64 kodlaması
- 3. Android varsayılan karakter kodlaması
- 4. Eclipse karakter kodlaması
- 5. Swift'de kodlamada Base64 kodlaması Android'de kod çözülmez
- 6. HttpFile :: SendRequest ve karakter kodlaması
- 7. GCC 4.7 Dize Literalleri İçin Kaynak Karakter Kodlaması ve Yürütme Karakter Kodlaması?
- 8. Hangi karakter kodlaması c3 82 c2 bf?
- 9. Excel'den CSV dosyasının karakter kodlaması MySQL'e
- 10. PHP'nin exec() 'dan komut satırı karakter kodlaması()
- 11. Hazırda bekletme Oracle ve Karakter Kodlaması
- 12. Ruby karakter kodlamasını belirleyin 1.9.3
- 13. Delphi kullanarak bir metin dosyasının karakter kodlaması nasıl algılanır?
- 14. Karakter Kodlaması: Neden e-posta alma kodum PyQt4'te çalıştırılamıyor?
- 15. Kullanırken kötü karakter kullanımı - [NSString drawInRect: withAttributes:]
- 16. Sınama serileştirme kodlaması
- 17. HTML5, herhangi bir karakter kodlaması sağlanmadığında HTML belgeleri için varsayılan karakter kodlamasını belirtir mi?
- 18. Ruby: Her X karakter karakterini boşluklara yerleştirin
- 19. Parametre Kodlaması Al
- 20. Zlib :: BuefError kullanırken progressbar/ruby-progressbar gem
- 21. Java - XML biçiminde görüntü kodlaması
- 22. Powershell Base64 Dize ile Dizin
- 23. Ekstralar 4.2: Belirli bir kılavuz sütununda base64 kodlaması ve kod çözme nasıl uygulanır
- 24. Node.JS - Base64 kullanarak görüntüleri Base64 kullanarak kodlama
- 25. File.ReadAllBytes, File.ReadAllText kullanırken neden farklı sonuç verir?
- 26. Jackson ObjectMapper UTF-8 kodlaması ile mi?
- 27. Decode Base64 dizgisi bayt dizisine
- 28. ruby 1.9.x'e bir kodlama ekliyor mu?
- 29. Base64 Java kullanıcı kimliği alanını encryping için Base64 şifreleme kullanıyorum Karakterler
- 30. geçersiz baytlı karakter Rails ile (US-ASCII) ve Ruby 1.9 Ruby kullanıyorum
Bu, Victor'un cevabının yorumlarındaki şüphelerimi kabul eder. Doğrulama için teşekkürler. – Brent