2012-11-22 17 views
12

मैं आईएसओ 885 9 -1 एन्कोडेड स्ट्रिंग को यूटीएफ -8 में परिवर्तित करने की कोशिश कर रहा हूं।गोलांग कनवर्ट iso8859-1 से utf8

निम्न फ़ंक्शन मेरे टेस्टडाटा के साथ काम करता है जिसमें जर्मन उमोट्स शामिल हैं, लेकिन मुझे पूरा यकीन नहीं है कि रनवे (बी) कास्ट एन्कोडिंग कौन सा स्रोत एन्कोडिंग करता है। क्या यह किसी प्रकार का डिफ़ॉल्ट एन्कोडिंग मान रहा है, उदा। आईएसओ 885 9 -1 या क्या यह कहने का कोई तरीका है कि एन्कोडिंग का उपयोग किस प्रकार किया जाए?

func toUtf8(iso8859_1_buf []byte) string { 
    var buf = bytes.NewBuffer(make([]byte, len(iso8859_1_buf)*4)) 
    for _, b := range(iso8859_1_buf) { 
     r := rune(b) 
     buf.WriteRune(r) 
    } 
    return string(buf.Bytes()) 
} 
+1

वैसे, आपका मतलब iso8859-1 है, है ना? – ANisus

+0

हां, भ्रम के बारे में खेद है, मैंने इसे संपादित किया है। – zeroc8

उत्तर

12

रूणint32 के लिए एक उपनाम है, और जब यह एन्कोडिंग की बात आती है, एक रूण यूनिकोड वर्ण मूल्य (कोड अंक) मानी जाती है। तो rune(b) में b मान यूनिकोड मान होना चाहिए। 0x00 - 0xFF के लिए यह मान लैटिन -1 के समान है, इसलिए आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।

फिर आपको रनों को यूटीएफ 8 में एन्कोड करने की आवश्यकता है। लेकिन यह एन्कोडिंग बस []rune से string को परिवर्तित करके किया जाता है।

यह बाइट्स पैकेज का उपयोग किए बिना अपने कार्य का एक उदाहरण है:

func toUtf8(iso8859_1_buf []byte) string { 
    buf := make([]rune, len(iso8859_1_buf)) 
    for i, b := range iso8859_1_buf { 
     buf[i] = rune(b) 
    } 
    return string(buf) 
} 
+0

मैंने सोचा कि केवल 0x7f तक के मान समान थे, इसे इंगित करने के लिए धन्यवाद। – zeroc8

+2

यूनिकोड और लैटिन -1 में मान समान हैं (लैटिन -1 को यूनिकोड के 0x00 - 0xFF सबसेट माना जा सकता है)। लेकिन जब आप मान संग्रहीत करते हैं, लैटिन -1 केवल 1 बाइट (उदाहरण के लिए '0x41') का उपयोग करता है जबकि यूनिकोड 4 बाइट्स (उदाहरण के लिए' 0x00000041') का उपयोग करता है। उलझन में क्या हो सकता है यूटीएफ -8 एन्कोडिंग जहां केवल 0x00 - 0x7F को एक बाइट का उपयोग करके लैटिन -1 के रूप में एन्कोड किया जाता है। – ANisus

+0

यूटीएफ -8 कोड बिंदु मौजूद नहीं हैं। क्या आपका मतलब यूटीएफ -8 कोड इकाइयां हैं? –

2

r := rune(expression) 

का असर है:

  • प्रकार rune (उर्फ साथ घोषित चर r int32 के लिए)।
  • एक्सप्रेशन के मूल्य के साथ परिवर्तनीय r प्रारंभ करें।

नहीं (पुनः) एन्कोडिंग शामिल है और कह रही है कि कौन सा वैकल्पिक रूप से उपयोग किया जाना चाहिए केवल कोड में कुछ पुनः-एन्कोडिंग को स्पष्ट रूप से लिखना/संभालना संभव है। सौभाग्य से, इस मामले में कोई (पुनः) एन्कोडिंग आवश्यक नहीं है, यूनिकोड ने ASCII के तुलनात्मक रूप से आईएसओ 885 9 -1 के उन कोडों को शामिल किया है। (यदि मैंने सही ढंग से here चेक किया है)

+0

रीनकोडिंग की आवश्यकता है। Ö जैसे पत्र एक ही तरीके से एन्कोड नहीं किया गया है। यदि आपके पास बाइट स्ट्रिंग 'latin1 = [] बाइट {0x52, 0xE4, 0x76}' है, तो यह स्ट्रिंग में अच्छी तरह से परिवर्तित नहीं होगा। (यह कहता है * लैटिन -1 में RAV * – ANisus

+2

लेकिन 0xE4 वास्तव में 'ä' है, आईओएस 885 9 -1 में नहीं, http://en.wikipedia.org/wiki/ISO/IEC_8859-1#Codepage_layout। इसे यहां देखें: http://play.golang.org/p/s4TfzJUa7m – zzzz

+0

आह, मुझे लगता है कि मैंने गलत समझा। सच है कि लैटिन -1 और यूनिकोड के बीच कोई रीकोडिंग की आवश्यकता नहीं है। हां, बाइट अनुक्रम राव कहते हैं – ANisus

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