2015-03-28 6 views
11

Ho un controller API che riceve informazioni sul percorso di un file multimediale e tag ID3 e li salva in un'istanza di Active Record, utilizzando PostgreSQL/Rails.Affrontare "stringa contiene byte null" inviato dagli utenti

A volte però l'utente invia le stringhe come ad esempio:

"genre"=>"Hip-Hop\u0000Hip-Hop/Rap" 

e Rails/Postgres non sono esattamente felice di questo quando si cerca di persistere sulla save:

An ArgumentError occurred in internals#receive: 

string contains null byte 
activerecord (3.2.21) lib/active_record/connection_adapters/postgresql_adapter.rb:1172:in `send_query_prepared' 

Come posso pulire questo stringa in Ruby per rimuovere completamente i byte null?

+0

Sembra che si sta ricevendo testo in una codifica UTF-16. Invece di provare a "ripulirlo", ti consiglio di confermarlo con il mittente e, se questo è il caso, utilizzare la codifica di Ruby per convertire il testo in UTF-8. Lo spogliamento del personaggio non aiuta se si verifica su altri segni diacritici. Inoltre, sia Ruby che PostgreSQL possono essere disturbati se si tenta di memorizzare una stringa codificata in un modo in un campo definito per un altro tipo di codifica, quindi è necessario essere accurati. –

+1

sfortunatamente gli utenti sono in tutto il mondo e non posso chiedere loro di cambiare questa roba, quindi la correzione deve essere lato server, anche perché questi dati vengono inviati dalle nostre applicazioni di terze parti. –

+1

È possibile controllare una stringa per vedere se è possibile determinarne la codifica. A volte puoi essere fortunato e ottenere una stringa che è in realtà tutta una codifica, il che rende facile arrivare dove stai andando. A volte ottieni una stringa che contiene più codifiche e quindi devi codificarle per quello, ma come ti resta da capire. Chiedere alle persone di cambiarti non è probabile che accada a meno che non abbiano bisogno della tua API/servizio. Questa è una fossa di coniglio molto grossa in cui cadere e può trasformarsi in una situazione molto delicata. –

risposta

12

Il metodo gsub su String è probabilmente adatto. Puoi semplicemente fare string.gsub("\u0000", '') per sbarazzartene.

http://ruby-doc.org/core-2.1.1/String.html#method-i-gsub

+0

C'è un motivo per non usare 'string.delete (" \ u0000 ")'? –

+0

No, funzionerebbe bene, quindi 'string.tr'. In effetti 'tr' e delete sono entrambi più appropriati di' gsub' in questo caso – tpbowden

Problemi correlati