2012-12-15 3 views
5

गो में, मैं लाइन द्वारा फ़ाइल लाइन में str या []rune में पढ़ना चाहता हूं।फ़ाइल को कैसे पढ़ा जाए, त्रुटि के साथ निरस्त करें यदि यह मान्य यूटीएफ -8 नहीं है?

फ़ाइल को यूटीएफ -8 में एन्कोड किया जाना चाहिए, लेकिन मेरे कार्यक्रम पर भरोसा नहीं करना चाहिए। यदि इसमें अमान्य यूटीएफ -8 है, तो मैं त्रुटि को सही तरीके से संभालना चाहता हूं।

bytes.Runes(s []byte) []rune है, लेकिन इसमें कोई त्रुटि वापसी मूल्य नहीं है। क्या यह अमान्य यूटीएफ -8 का सामना करने पर घबराएगा?

उत्तर

10

उदाहरण के लिए,

package main 

import (
    "bufio" 
    "fmt" 
    "io/ioutil" 
    "os" 
    "strings" 
    "unicode/utf8" 
) 

func main() { 
    tFile := "text.txt" 
    t := []byte{'\xFF', '\n'} 
    ioutil.WriteFile(tFile, t, 0666) 
    f, err := os.Open(tFile) 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 
    defer f.Close() 
    r := bufio.NewReader(f) 
    s, err := r.ReadString('\n') 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 
    s = strings.TrimRight(s, "\n") 
    fmt.Println(t, s, []byte(s)) 
    if !utf8.ValidString(s) { 
     fmt.Println("!utf8.ValidString") 
    } 
} 

आउटपुट:

[255 10] � [255] 
!utf8.ValidString 
+2

तो संक्षेप में प्रस्तुत करने के लिए: 1. पढ़ने इनपुट [] में बाइट या स्ट्रिंग 2. जांच utf8.Valid या utf8.ValidString 3. यदि वैध का उपयोग कर वैध है, [] रूण में बदलने का है, तो बाइट्स का उपयोग कर की जरूरत .Runes या [] rune (str) धन्यवाद! मैं इस जवाब का चयन कर रहा हूं क्योंकि इनपुट के माध्यम से जाने के लिए एक लूप लिखना - जैसा कि जेएनएमएल के उदाहरण में - ऐसा कुछ नहीं है जब मैं हर बार यह समस्या उठाना चाहता हूं। –

2

उदाहरण के लिए:

import (
    "io/ioutil" 
    "log" 
    "unicode/utf8" 
) 

// ... 

buf, err := ioutil.ReadAll(fname) 
if error != nil { 
     log.Fatal(err) 
} 

size := 0 
for start := 0; start < len(buf); start += size { 
     var r rune 
     if r, size = utf8.DecodeRune(buf[start:]); r == utf8.RuneError { 
       log.Fatalf("invalid utf8 encoding at ofs %d", start) 
     } 
} 

utf8.DecodeRune godocs:

डीकोड्रून पी में पहले यूटीएफ -8 एन्कोडिंग को अनपैक करता है और रनऔर इसकी चौड़ाई बाइट्स देता है। यदि एन्कोडिंग अमान्य है, तो यह (RuneError, 1) देता है, सही यूटीएफ -8 के लिए एक असंभव परिणाम।

+0

यह वही है जो ['यूनिकोड/utf8/ValidString'] (http://golang.org/src/pkg/unicode/utf8/utf8.go?s=8560:8591#L373) करता है। – nemo

+0

@nemo क्या आप लाइन नंबर देकर "वाक्यविन्यास त्रुटि" w/o कहने के लिए एक कंपाइलर पसंद करते हैं? ;-) – zzzz

+0

बेशक नहीं, प्रश्न, जैसा कि मैंने इसे समझा, 'यह पता लगाने का सबसे अच्छा तरीका क्या है कि पाठ मान्य है utf8' और नहीं 'उस जगह को खोजने का सबसे अच्छा तरीका क्या है जहां मेरे टेक्स्ट में अमान्य utf8 है '। लेकिन यह सिर्फ नाइटपिकिंग है, मैं भविष्य में पाठकों को दिशा में इंगित करना चाहता था, कि आपका कोड काफी कुछ है जो 'वैध स्ट्रिंग' करता है और किसी को किसी कारण के लिए इसका उपयोग नहीं करना चाहिए (जैसे प्रश्न दो)। :) – nemo

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