Ruby/Encoding
Encoding Desteği
düzenleRuby 1.9'un gelişiyle beraber, Ruby string'ler, IO ve kaynak kodu için US-ASCII'den başka karakter kodlamaları da kullanmaya başladı. Ruby 1.9.3 MRI'ın Mac OSX Lion'da kurulumunda, Ruby aşağıdaki karakter kodlamalarına sahiptir:
- ASCII-8BIT
- UTF-8
- US-ASCII
- Big5
- Big5-HKSCS
- Big5-UAO
- CP949
- Emacs-Mule
- EUC-JP
- EUC-KR
- EUC-TW
- GB18030
- GBK
- ISO-8859-1
- ISO-8859-2
- ISO-8859-3
- ISO-8859-4
- ISO-8859-5
- ISO-8859-6
- ISO-8859-7
- ISO-8859-8
- ISO-8859-9
- ISO-8859-10
- ISO-8859-11
- ISO-8859-13
- ISO-8859-14
- ISO-8859-15
- ISO-8859-16
- KOI8-R
- KOI8-U
- Shift_JIS
- UTF-16BE
- UTF-16LE
- UTF-32BE
- UTF-32LE
- Windows-1251
- IBM437
- IBM737
- IBM775
- CP850
- IBM852
- CP852
- IBM855
- CP855
- IBM857
- IBM860
- IBM861
- IBM862
- IBM863
- IBM864
- IBM865
- IBM866
- IBM869
- Windows-1258
- GB1988
- macCentEuro
- macCroatian
- macCyrillic
- macGreek
- macIceland
- macRoman
- macRomania
- macThai
- macTurkish
- macUkraine
- CP950
- CP951
- stateless-ISO-2022-JP
- eucJP-ms
- CP51932
- GB2312
- GB12345
- ISO-2022-JP
- ISO-2022-JP-2
- CP50220
- CP50221
- Windows-1252
- Windows-1250
- Windows-1256
- Windows-1253
- Windows-1255
- Windows-1254
- TIS-620
- Windows-874
- Windows-1257
- Windows-31J
- MacJapanese
- UTF-7
- UTF8-MAC
- UTF-16
- UTF-32
- UTF8-DoCoMo
- SJIS-DoCoMo
- UTF8-KDDI
- SJIS-KDDI
- ISO-2022-JP-KDDI
- stateless-ISO-2022-JP-KDDI
- UTF8-SoftBank
- SJIS-SoftBank
Encoding Kullanımı
düzenleDefault olarak Ruby 2.='dan bu yana tüm Ruby kaynak dosyaları UTF-8 olarak kodlanmıştır. Bir dosyanın karakter kodlamasını değiştirmenin genel yolu "sihirli yorum satırı" denen yorum satırını kullanmaktır. Sihirli yorum satırı dosyanın en başında olmalıdır ya da hemen | shebang yorumun arkasında olmalıdır. Sihirli yorumun tek ihtiyacı vardır: Yorumda coding:
kelimesi ve takip eden bir karakter kodlama ismi. Yani aşağıdakiler geçerli sihirli yorum satırları:
#encoding: UTF-8
#coding: UTF-8
#blah blah coding: US-ASCII
Sihirli yorum satırı Ruby işleyiciye (interpreter) bu kaynak kodunun ve içindeki tüm string'lerin verilen karakter kodlamasında olduğunu bildirir. Yani şu geçerli bir kod:
#encoding: ISO-8859-1
puts "Olé!"
Ama bu değil:
#encoding: US-ASCII
puts "Olé!"
Çünkü ilk kodda karakter kodlaması ISO-8859-1 verilmiş (US-ASCII kodlamasına Fransızca ve İspanyolca karakterleri ekleyerek oluşturulan bir karakter kodlaması), bu durumda "é" karakteri geçerli olacaktır. Ancak US-ASCII kodlamasında "é" geçersiz bir karakterdir ve hata verecektir.
$ ruby encode.rb encode.rb: encode.rb:2: invalid multibyte char (US-ASCII) (SyntaxError) encode.rb:2: invalid multibyte char (US-ASCII)
String'leri Bağımsız Olarak Karakter Kodlamak
düzenleDosyanızın içindeki string'lerin karakter kodlarını bağımsız olarak da verebilirsiniz (her ne kadar string değerlerin ifadesinde hala sihirli yorum tarafından bildirilen kodlamada olması veya escape sequence aracılığıyla eklenmesi gerekse de). Bunu yapmak için String sınıfının iki metodu kullanılır: encode
ve force_encoding
.
encode
kod dönüştürmek için kullanılır.
Mesela ISO-8859-1 kodlamasıyla verilen "Olé!" string değerini, tüm karakterlerini içeren UTF-8 kodlamaya çevirmek için encode
kullanabilirsiniz. Bununla beraber, ISO-8859-1'de verilen bir string'i US-ASCII kodlamaya dönüştürmek isterseniz bu sadece değer ASCII karakterler içerdiğinde (örn. "Hello") mümkündür. encode
metodunun birçok opsiyonları vardır ve kapsamlı bir şekilde yapılandırılabilir. Orjinal dökümanına bakabilirsiniz. encode
metodunun püf noktası: Karakterlerin görseli ve anlamı aynı kalsa da altta yatan sayılar genelde aynı kalır. encode
metodunun string değerin altında yatan byte'ları değiştirme özgürlüğü vardır. Örnek:
#encoding: ISO-8859-1
"Olé!".encode("UTF-8") #Geçerli
"Olé!".encode("US-ASCII") #Error
force_encoding
metodu ise Ruby'ye string değerin bu dönüştürülecek encoding ile aynı sayısal değerlere sahip olduğunu ve değiştirilmemesi gerektiğini deklare eder (mesela ISO-8859-1 kodlamalı bir program içinde UTF-8 kodlamalı bir dosyadan değer okudunuz). force_encoding
metodu string değerin altında yatan byte'ları asla değiştirmez. Örnek:
#encoding: ISO-8859-1
"\u27d8".force_encoding("UTF-8")
ASCII-8 Bit
düzenleRuby ayrıca bir sahte karakter kodlaması da içerir: ASCII-8 Bit, veya BINARY. BINARY karakter kodlaması binary veriler için kullanılır.
#encoding: ISO-8859-1