在Haskell中使用UTF-8作为IO String读取文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Haskell中使用UTF-8作为IO String读取文件相关的知识,希望对你有一定的参考价值。

除非文件有qazxsw poli字符,否则我有以下代码可以正常工作:

utf-8

使用utf-8字符,我得到了这个:qazxsw poi

由于我正在使用的文件有module Main where import Ref main = do text <- getLine theInput <- readFile text writeFile ("a"++text) (unlist . proc . lines $ theInput) 字符,我想处理此异常,以便重用从hGetContents: invalid argument (invalid byte sequence)导入的函数(如果可能)。

有没有办法读取UTF-8文件作为Ref所以我可以重用我的UTF-8的功能?我应该对我的代码做什么修改?提前致谢。

我附上了IO String模块的函数声明:

Ref

来自前奏:

Ref
答案

这可以通过GHC的基本(但从标准扩展)unlist :: [String] -> String proc :: [String] -> [String] 模块完成,但您必须使用更多功能:

lines :: String -> [String]
另一答案

谢谢你的答案,但我自己找到了解决方案。实际上我正在使用的文件有这个编纂:

System.IO

因此,使用我的haskell代码处理该文件它应该具有此编码:

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.

您可以使用实用程序ISO-8859 text, with CR line terminators 检查文件编码,如下所示:

UTF-8 Unicode text, with CR line terminators

要更改文件编码,请按照此file的说明进行操作!

另一答案

使用$ file filename

缺乏unicode支持是标准Haskell IO库的一个众所周知的问题。

link

以上是关于在Haskell中使用UTF-8作为IO String读取文件的主要内容,如果未能解决你的问题,请参考以下文章

main函数不会在haskell中使用任何参数

使用 IO.readLn 从 Haskell 中的标准输入读取单行

为啥 Haskell 异常只能在 IO monad 中捕获?

Haskell IO 和关闭文件

如何在 Haskell 中将 main :: IO () 重写为由一个 main :: IO() 组成的两个函数

如何在 Haskell 中提供屏幕图像作为程序的输入