2015-03-28 19 views
11

Bir medya dosyasının yolu ve id3 etiketleri hakkında bilgi alan ve bunları PostgreSQL/Rails kullanarak bir Active Record örneğine kaydeden bir API denetleyicim var. Bunu temizlemek nasıl"string içeriyor null byte" ile kullanıcılardan gönderildi

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' 

: Kullanıcı gibi dizeleri gönderir Bazen ancak

: save hâlâ mevcut çalışırken

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

ve Raylar/Postgres bu konuda tam olarak memnun değil Tamamen boş bayt kaldırmak için Ruby'de dize?

+0

görünüyor. "Temizlemeyi" denemek yerine, göndericiyle bunu doğrulamanızı öneririm ve eğer durum buysa, metni UTF-8'e dönüştürmek için Ruby's Encoding'i kullanın. Willy-nilly karakterin sıyrılması diğer aksaklıklarda meydana gelmesi durumunda yardımcı olmaz. Ayrıca, başka bir kodlama türü için tanımlanmış bir alana kodlanmış bir dizeyi kaydetmeye çalıştığınızda, hem Ruby hem de PostgreSQL bozuk olabilir, bu yüzden kapsamlı olmanız gerekir. –

+1

maalesef kullanıcılar dünyanın dört bir yanında ve bu şeyleri değiştirmelerini söyleyemem. Bu veriler bizim tarafımızdan ve üçüncü şahıs uygulamalarımız tarafından gönderildiği için bile sunucu tarafı düzeltmek zorunda. –

+1

Kodlamasını kontrol etmenin mümkün olup olmadığını görmek için bir dizgiyi kontrol etmek mümkündür. Bazen şanslı olursunuz ve aslında tek bir kodlama olan bir ipucu elde edersiniz, bu da nereye gideceğinize kolayca ulaşmanızı sağlar. Bazen birden çok kodlama içeren bir dize alırsınız ve bunun için kod yazmanız gerekir, ancak sizin için ne anlama geldiğini anlayabilirsiniz. İnsanların size değişmesini istemek, API/hizmetinize kötü bir şekilde ihtiyaç duymadıkça gerçekleşmeyecektir. Bu, içine düşecek çok gevrek bir tavşan deliğidir ve çok zor bir duruma dönüşebilir. –

cevap

12

String'daki gsub yönteminin kullanılması muhtemelen uygundur. Onlardan kurtulmak için sadece string.gsub("\u0000", '') yapabilirsiniz. Eğer UTF-16 kodlama metni alıyorsanız gibi

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

+0

'string.delete (" \ u0000 ")' kullanılmaması için bir neden var mı? –

+0

Hayır, bu da işe yaramazdı, yani string.tr'. Aslında, tr 've silme, bu durumda gsub'dan daha uygundur – tpbowden

İlgili konular