2015-10-30 10 views
8

मैं है निम्नलिखित कोड जब तक फ़ाइल utf-8 characteres है जो ठीक काम करता है: hGetContents: invalid argument (invalid byte sequence)पढ़ें फ़ाइल के रूप में आईओ स्ट्रिंग

:

module Main where 
import Ref 
main = do 
    text <- getLine 
    theInput <- readFile text 
    writeFile ("a"++text) (unlist . proc . lines $ theInput) 
utf-8 characteres साथ

मैं इस मिल

चूंकि जिस फ़ाइल में मैं काम कर रहा हूं उसके पास UTF-8 वर्ण हैं, इसलिए यदि संभव हो तो Ref से आयात किए गए कार्यों का पुन: उपयोग करने के लिए मैं इस अपवाद को संभालना चाहता हूं।

फ़ाइल को IO String के रूप में पढ़ने का कोई तरीका है तो मैं अपने Ref के फ़ंक्शंस का पुन: उपयोग कर सकता हूं? मुझे अपने कोड में क्या संशोधन करना चाहिए? अग्रिम में धन्यवाद। प्रस्तावना से

unlist :: [String] -> String 
proc :: [String] -> [String] 

:

मैं अपने Ref मॉड्यूल से कार्यों घोषणाओं देते

lines :: String -> [String] 

उत्तर

2

जवाब के लिए धन्यवाद, लेकिन मैं खुद से समाधान मिला। असल में फ़ाइल के साथ मैं काम कर रहा था इस संहिताकरण है:

UTF-8 Unicode text, with CR line terminators 

आप के साथ फ़ाइल संहिताकरण की जाँच कर सकते हैं:

ISO-8859 text, with CR line terminators 

तो मेरी Haskell कोड के साथ कि फ़ाइल के साथ कार्य करने के लिए यह बजाय इस संहिताकरण होना चाहिए उपयोगिता file इस तरह:

$ file filename 

फ़ाइल संहिताकरण को बदलने के लिए इससे निर्देशों का पालन करें!

0

उपयोग System.IO.Encoding

यूनिकोड समर्थन की कमी मानक हास्केल आईओ पुस्तकालय के साथ एक अच्छी तरह से ज्ञात समस्या है।

module Main where 

import Prelude hiding (readFile, getLine, writeFile) 
import System.IO.Encoding 
import Data.Encoding.UTF8 

main = do 
    let ?enc = UTF8 
    text <- getLine 
    theInput <- readFile text 
    writeFile ("a"++text) (unlist . proc . lines $ theInput) 
3

यह सिर्फ GHC की बुनियादी (लेकिन मानक से बढ़ाया गया) System.IO मॉड्यूल के साथ किया जा सकता है, हालांकि आप तो अधिक कार्यों का उपयोग करना होगा:

module Main where 

import Ref 
import System.IO 

main = do 
    text <- getLine 
    inputHandle <- openFile text ReadMode 
    hSetEncoding inputHandle utf8 
    theInput <- hGetContents inputHandle 
    outputHandle <- openFile ("a"++text) WriteMode 
    hSetEncoding outputHandle utf8 
    hPutStr outputHandle (unlist . proc . lines $ theInput) 
    hClose outputHandle -- I guess this one is optional in this case. 
संबंधित मुद्दे