Dalam banyak bahasa terdapat sepasang fungsi, chr()
dan ord()
, yang mengonversi antara angka dan nilai karakter. Dalam beberapa bahasa, ord()
disebut asc()
.
Ruby punya Integer#chr
, yang berfungsi dengan baik:
>> 65.chr
A
Cukup adil. Tapi bagaimana Anda pergi ke arah lain?
"A".each_byte do |byte|
puts byte
end
cetakan:
65
dan itu cukup dekat dengan apa yang saya inginkan. Tetapi saya benar-benar lebih suka menghindari loop - Saya mencari sesuatu yang cukup pendek agar dapat dibaca saat mendeklarasikan file const
.
Mencoba:
sumber
Saya ingin memberi +1 pada komentar dylanfm dan AShelly, tetapi tambahkan [0]:
'A'.unpack('C')[0]
Panggilan unpack mengembalikan Array yang berisi integer tunggal, yang tidak selalu diterima di mana integer diinginkan:
Saya mencoba menulis kode yang berfungsi di Ruby 1.8.1, 1.8.7 dan 1.9.2.
Diedit untuk meneruskan C untuk membongkar dalam huruf besar, karena membongkar ("c") memberi saya -1 di mana ord () memberi saya 255 (meskipun berjalan pada platform di mana karakter C ditandatangani).
sumber
Baru saja menemukan ini saat menyusun versi Ruby murni dari Stringprep melalui RFC.
Hati-hati jika
chr
gagal di luar [0,255], gunakan pengganti portabel 1.9.x - 2.1.x:sumber
char
dan kebalikannya dalam kasus unicode yang benarSelain itu, jika Anda memiliki karakter dalam string dan Anda ingin mendekodekannya tanpa loop:
sumber
Bagaimana tentang
sumber
Anda dapat memiliki ini:
sumber
Jika Anda tidak keberatan mengeluarkan nilai dari array, Anda dapat menggunakan
"A".bytes
sumber
Saya menulis kode untuk 1.8.6 dan 1.9.3 dan saya tidak bisa mendapatkan solusi ini untuk bekerja di kedua lingkungan :(
Namun, saya menemukan solusi lain: http://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
Itu juga tidak berhasil untuk saya tetapi saya menyesuaikannya untuk saya gunakan:
Setelah melakukan itu, maka yang berikut ini akan berfungsi di kedua lingkungan
sumber
"A".unpack("C")[0]
itu menargetkan Ruby 1.8.1, Ruby 1.8.7 dan Ruby 1.9.2. Apakah itu gagal di lingkungan Anda? Kegagalan macam apa?self.status = tagAccountString[4].unpack('C')[0]
Di 1.8.6 saya mendapatkanException undefined method
unpack 'for 0: Fixnum memproses data tag buffered utama - exit` Kode berikut berfungsi (dengan solusi yang saya usulkan) di kedua lingkungan.self.status = tagAccountString[4].ord
Setiap saran (misalnya solusi yang lebih baik) lebih dari diterimatagAccountString[4]
mengembalikan String di Rubi yang lebih baru tetapi digunakan untuk mengembalikan Fixnum di Ruby 1.8. Itulah mengapa Anda melihat kesalahanundefined method unpack for 0:Fixnum
,. Anda dapat menggunakanstatus = tagAccountString[4,1].unpack('C')[0]
atau bahkanstatus, = tagAccountString.unpack('xxxxC')
jika Anda selalu ingin mengabaikan empat karakter dan mengonversi yang berikutnya.