2016-06-14 20 views
7

Ho lavorato con i metodi Ruby chr e ord di recente e ci sono alcune cose che non capisco.Cercando di capire i metodi .kr e .ord Ruby

Il mio progetto attuale prevede la conversione di singoli caratteri da e verso valori ordinali. A quanto ho capito, se ho una stringa con un carattere individuale come "A" e chiamo ord su di essa ottengo la sua posizione sulla tabella ASCII che è 65. Chiamando l'inverso, 65.chr mi dà il valore del carattere "A", quindi questo mi dice che Ruby ha una collezione da qualche parte dei valori dei caratteri ordinati, e può usare questa collezione per darmi la posizione di un personaggio specifico, o il personaggio in una posizione specifica. Potrei sbagliarmi, per favore correggimi se lo sono.

Ora capisco anche che la codifica dei caratteri predefinita di Ruby utilizza UTF-8 in modo che possa funzionare con migliaia di possibili caratteri. Così se chiedo per qualcosa di simile:

'好'.ord 

ottengo la posizione di quel carattere che è 22909. Tuttavia, se chiamo chr su tale valore:

22909.chr 

ottengo "RangeError: 22909 nell'intervallo di carica. " Sono in grado di ottenere solo char per lavorare su valori fino a 255 che sono estesi ASCII. Quindi le mie domande sono:

  • Perché Rubino sembrano essere sempre i valori per chr dal carattere ASCII esteso set ma ord da UTF-8?
  • C'è un modo per dire a Ruby di usare diverse codifiche quando usa questi metodi? Ad esempio, digli di usare la codifica ASCII-8BIT invece di qualsiasi impostazione predefinita?
  • Se è possibile modificare la codifica predefinita, esiste un modo per ottenere il numero totale di caratteri disponibili nel set utilizzato?
+6

http://apidock.com/ruby/Integer/chr menzioni è possibile utilizzare qualcosa come '' 22909.chr (Codifica :: UTF_8) ''. La codifica ha anche '' Encoding :: ASCII_8BIT'' se vuoi usarlo. –

+0

@NabeelAmjad Dovresti postarlo come risposta. –

+0

Questo è molto utile, non l'avevo visto e questo mi porta molto lontano dove sto andando. Ora, l'unica cosa che mi manca è un modo semplice per ottenere il numero di caratteri disponibili per una codifica specifica. Ad esempio ASCII_8BIT ha 256 caratteri, UTF_8 circa 1.1 milione, ect. E sì, per favore postalo come risposta. –

risposta

3

In base a Integer#chr è possibile utilizzare quanto segue per forzare la codifica su UTF_8.

22909.chr(Encoding::UTF_8) 
#=> "好" 

Per elencare tutti i nomi che codificano disponibili

Encoding.name_list 
#=> ["ASCII-8BIT", "UTF-8", "US-ASCII", "UTF-16BE", "UTF-16LE", "UTF-32BE", "UTF-32LE", "UTF-16", "UTF-32", ...] 

Un modo hacky per ottenere il numero massimo di caratteri

2000000.times.reduce(0) do |x, i| 
    begin 
    i.chr(Encoding::UTF_8) 
    x += 1 
    rescue 
    end 

    x 
end 
#=> 1112064 
+0

Molto bello, grazie. Avevo paura di provare qualcosa del genere per ottenere il numero massimo di caratteri. Non carina, ma lavoriamo con quello che abbiamo, giusto? Buongiorno amico. –

0

Dopo utensili in giro con questo per un po ', ho capito che mi potrebbe ottenere il numero massimo di caratteri per ogni codifica eseguendo una ricerca binaria per trovare il valore più alto che non genera un RangeError.

def get_highest_value(set) 
    max = 10000000000 
    min = 0 
    guess = 5000000000 

    while true 
    begin guess.chr(set) 
     if (min > max) 
     return max 
     else 
     min = guess + 1 
     guess = (max + min)/2 
     end 
    rescue 
     if min > max 
     return max 
     else 
     max = guess - 1 
     guess = (max + min)/2 
     end 
    end 
    end 
end 

Il valore immesso nel metodo è il nome della codifica controllata.

Problemi correlati