2012-06-27 9 views
5

एक सर्वर UTF-8 बाइट भेजता है, तो आप उन्हें कैसे पात्रों शुद्ध बाइट्स बनने के बिना पढ़ा करते हैं? (\ X40 आदि)रूबी में, सॉकेट से यूटीएफ -8 कैसे पढ़ा जाए?

+0

आप सॉकेट कैसे पढ़ूं? – Reactormonk

+0

आईओ का एक संयोजन का चयन ::() और आईओ # read_nonblock – lcarpenter

उत्तर

3

मेरा मानना ​​है कि read_nonblock का उपयोग करता read, जो बारी में कहते हैं:

परिणामस्वरूप स्ट्रिंग हमेशा ASCII-8 बिट एन्कोडिंग है।

आपको लगता है कि आप के बाद आप पढ़ पूरे स्ट्रिंग, इसकी एन्कोडिंग (String#force_encoding! का प्रयोग करके) UTF-8 करने के लिए मजबूर कर सकते हैं IO#set_encoding निर्दिष्ट करने की आवश्यकता नहीं है, लेकिन इसका मतलब है।

मैंने 'पूरे' पर जोर दिया, क्योंकि आपको यह सुनिश्चित करने की आवश्यकता है कि आप स्ट्रिंग के अंत में पूरे यूनिकोड चरित्र को पढ़ लें, जैसे कि इसका केवल एक हिस्सा पढ़ा जाए, आपको अमान्य यूटीएफ -8 वर्ण मिलेगा और रुबी शिकायत कर सकता है इसके बारे में लाइन नीचे और नीचे।

4

आप IO#set_encoding का उपयोग UTF-8 में एक सॉकेट के बाहरी एन्कोडिंग सेट करने के लिए कर सकते हैं।

#!/usr/bin/env ruby 
# -*- coding: utf-8 -*- 

require 'socket' 

server_socket = TCPServer.new('localhost', 0) 
Thread.new do 
    loop do 
    session_socket = server_socket.accept 
    session_socket.set_encoding 'ASCII-8BIT' 
    session_socket.puts "  ᚁ ᚂ ᚃ ᚄ ᚅ ᚆ ᚇ ᚈ ᚉ ᚊ ᚋ ᚌ ᚍ" 
    session_socket.close 
    end 
end 

client_socket = TCPSocket.new('localhost', server_socket.addr[1]) 
client_socket.set_encoding 'UTF-8' 
p client_socket.gets 
# => "|  ᚁ ᚂ ᚃ ᚄ ᚅ ᚆ ᚇ ᚈ ᚉ ᚊ ᚋ ᚌ ᚍ\n" 
+0

चाहेंगे आईओ # set_encoding काम अगर मैं एक सॉकेट एक-एक करके #read_nonblock साथ के बंद बाइट्स पढ़ रहा हूँ? – lcarpenter

+0

@lcarpenter, मुझे नहीं लगता कि क्यों नहीं। क्या आपने कोशिश की है और पाया है कि यह नहीं है? –

+0

आह, नहीं, इस पद्धति काफी – lcarpenter

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