2011-08-10 8 views
7

मेरे पास कुछ पाठ है जिसमें यूनिकोड एस्केप अनुक्रम जैसे \ u003C शामिल हैं।क्या रूबी में यूनिस्केप यूनिकोड एस्केप दृश्यों का यह सबसे अच्छा तरीका है?

string.gsub(/\u(....)/) {|m| [$1].pack("H*").unpack("n*").pack("U*")}

यह सही है: यह क्या मैं इसे unescape के साथ आया है? (यानी यह मेरे परीक्षणों के साथ काम करता प्रतीत होता है, लेकिन क्या कोई और जानकार इसके साथ कोई समस्या ढूंढ सकता है?)

+0

ठीक है आप हैं। यह Rails ActiveSupport :: JSON से आ रहा है और ActiveSupport :: JSON द्वारा डीकोड किया जा रहा है, लेकिन यह डीकोडिंग नहीं कर रहा है \ u ठीक से बच निकलता है। (रेल 2.1.2 पर) –

उत्तर

17

आपकी regex, /\u(....)/, कुछ समस्याएं हैं।

सबसे पहले, \u तरह से आपको लगता है यह होता है, 1.9 में आप एक त्रुटि मिल जाएगा और 1.8 में यह सिर्फ \u जोड़ी है कि आप देख रहे हैं बजाय एक एकल u से मिलान करेगा काम नहीं करता है; आपको का उपयोग शाब्दिक \u ढूंढने के लिए करना चाहिए जो आप चाहते हैं।

दूसरा, आपका (....) समूह बहुत अधिक अनुमोदित है, जो किसी भी चार वर्णों को अनुमति देगा और यह वही नहीं है जो आप चाहते हैं। 1.9 में, आप (\h{4}) (चार हेक्साडेसिमल अंक) चाहते हैं लेकिन 1.8 में आपको ([\da-fA-F]{4}) की आवश्यकता होगी \h एक नई बात है।

तो यदि आप चाहते हैं कि आपका रेगेक्स 1.8 और 1.9 दोनों में काम करे, तो आपको /\\u([\da-fA-F]{4})/ का उपयोग करना चाहिए।

>> s = 'Where is \u03bc pancakes \u03BD house? And u1123!' 
=> "Where is \\u03bc pancakes \\u03BD house? And u1123!" 
>> s.gsub(/\\u([\da-fA-F]{4})/) {|m| [$1].pack("H*").unpack("n*").pack("U*")} 
=> "Where is μ pancakes ν house? And u1123!" 

यूनिकोड वर्ण में हेक्स संख्या वध करने के लिए pack और unpack का प्रयोग शायद काफी अच्छा है, लेकिन वहाँ बेहतर तरीके हो सकते हैं: यह आपको 1.8 और 1.9 में निम्नलिखित देता है।

+1

स्ट्रिंग क्लास (मैंने स्ट्रिंग # utf8_decode का उपयोग किया) के विस्तार के रूप में जोड़ने के लिए भी उपयोगी हो सकता है। – Mikey

संबंधित मुद्दे