2013-02-12 66 views
5

यह iconv मुहावरा UTF-8 के लिए एक स्ट्रिंग ट्रांसकोड और अक्षर हैं जो ट्रांस्लितेरातेद नहीं किया जा सकता बूँदें:आप 'Iconv.new ("UTF8 // IGNORE", ...) के लिए एक परीक्षण कैसे लिखेंगे?' Idiom?

require "iconv" 

def normalize(text) 
    Iconv.new('UTF-8//IGNORE', 'UTF-8').iconv(text.dup) 
end 

कैसे आपसे वास्तव में यह एक परीक्षण लिखना चाहते हैं?

संपादित करें: मैं सवाल को सरल बनाने के बाद से मैं एक रेल # encoding: utf-8 कल्पना फ़ाइल मुद्दा उलझी गया था में यह परीक्षण करने के लिए कोशिश कर रहा है के संदर्भ एहसास हुआ समाप्त हो गया। तो अब बक्षीस मूर्खतापूर्ण है लेकिन अगर मैं कोई टेस्ट दिखा सकता हूं तो मैं इसे पुरस्कृत कर दूंगा।

+0

हो सकता है, http://robots.thoughtbot.com/post/42664369166/fight-back-utf-8-invalid-byte-sequences – Hock

उत्तर

3

आप #pack विधि का उपयोग कर एक बाइट सरणी से स्ट्रिंग्स बना सकते हैं। इस तरह, आप आसानी से एक अवैध/खराब स्ट्रिंग उत्पन्न कर सकते हैं और परीक्षण में इसका उपयोग कर सकते हैं।

उदाहरण:

describe "#normalize" do 
    it "should remove/ignore invalid characters" do 
    # this "string" equals "Mandados de busca do caso Megaupload considerados inv\xE1lidos - Tecnologia - Sol" 
    bad_string = [77, 97, 110, 100, 97, 100, 111, 115, 32, 100, 101, 32, 98, 117, 115, 99, 97, 32, 100, 111, 32, 99, 97, 115, 111, 32, 77, 101, 103, 97, 117, 112, 108, 111, 97, 100, 32, 99, 111, 110, 115, 105, 100, 101, 114, 97, 100, 111, 115, 32, 105, 110, 118, 225, 108, 105, 100, 111, 115, 32, 45, 32, 84, 101, 99, 110, 111, 108, 111, 103, 105, 97, 32, 45, 32, 83, 111, 108].pack('c*').force_encoding('UTF-8') 

    normalize(bad_string).should == 'Mandados de busca do caso Megaupload considerados invlidos - Tecnologia - Sol' 
    end 
end 

इसे देखो (मैं नहीं बल्कि लंबे समय तक परीक्षण स्ट्रिंग के लिए माफी चाहता हूँ, मैं तो बस मेरे कोड में एक छोटा उदाहरण मिल सकता है)

+0

क्या आप अपने परीक्षण में 'force_encoding' के उद्देश्य की व्याख्या कर सकते हैं? क्या यह 'स्वीकृति-वर्णसेट = utf8' रूप या कुछ के माध्यम से एक स्ट्रिंग को पारित करने की प्रक्रिया का अनुकरण करेगा? – danneu

+0

हां, बिल्कुल। जिस चीज़ को आप अपनी 'सामान्यीकृत' विधि से प्राप्त करना चाहते हैं वह अमान्य utf8 तारों को मान्य में परिवर्तित करना है। तो अपनी विधि का परीक्षण करने के लिए, आपको पहले एक अवैध utf8 स्ट्रिंग बनाना होगा। और उपर्युक्त विधि यह है कि मुझे यह प्राप्त करने का सबसे आसान तरीका है: बाइट्स के संग्रह से स्ट्रिंग बनाने के लिए 'पैक' का उपयोग करें और फिर इस स्ट्रिंग को utf8 के रूप में चिह्नित करने के लिए 'force_encoding' ... – severin

1

रेल में इसका परीक्षण, यहां तक ​​कि #encoding सेट के साथ भी संभव है।

require "iconv" 
require "cgi" 

def normalize(text) 
    Iconv.new('UTF-8//IGNORE', 'UTF-8').iconv(text) 
end 

puts normalize(CGI.unescape("m%FCstring")) # => mstring 

ताकि आप के साथ एक अभिकथन लिख सकते हैं:

सिर्फ यूआरएल-पलायन की तरह एक एन्कोडिंग कदम का उपयोग करें।

जब आप रूबी का उपयोग कर रहे हैं 1.9 Iconv को बहिष्कृत किया गया है और आपको स्ट्रिंग के encode विधियों का उपयोग करना चाहिए!

+0

हाँ, यह प्रश्न इस बारे में आया क्योंकि मैं रूबी 2.0.0 के लिए 'स्ट्रिंग # एन्कोड' के साथ Iconv को प्रतिस्थापित करने की कोशिश कर रहा हूं संगतता और मैं प्रतिगमन के खिलाफ बचाव करने की कोशिश कर रहा हूं। – danneu

+0

तो उत्तर आपके प्रश्न के अनुरूप नहीं है? या आप इसे छोड़कर क्यों नहीं? – phoet