Haskell中如何正确打印包含UTF-8 Text的记录?
解决Haskell中打印含UTF-8字符的Text字段记录问题
问题出在Haskell标准库对Text类型的默认Show实例上——它会把非ASCII字符转义成Unicode码点形式,所以你看到的是"\2361..."这种输出。下面给你两种通用的解决方法:
方法一:手动自定义Show实例(适合少量数据类型)
直接为每个数据类型写Show实例,把Text字段转成字符串后直接输出原始内容:
import Data.Text (Text) import qualified Data.Text as T data Person = Person { name :: Text , age :: Int } -- 自定义Show实例,直接输出Text的原始字符 instance Show Person where show (Person userName userAge) = "Person {name = " ++ T.unpack userName ++ ", age = " ++ show userAge ++ "}" secondPerson :: Person secondPerson = Person { name = "हर्षल पाटील", age = 100 } main :: IO () main = do putStrLn "Second Person" print secondPerson
方法二:用text-show库实现通用自动处理(适合大量数据类型)
如果有很多带Text字段的记录,手动写Show实例太繁琐,推荐用text-show库,它能自动为数据类型生成友好的TextShow实例,直接输出UTF-8字符:
步骤1:添加依赖
在你的cabal配置文件或stack.yaml里加入text-show依赖:
build-depends: base >= 4.14 && < 5, text, text-show >= 3.9
步骤2:编写代码
启用泛型推导,自动生成TextShow实例,用库提供的printT替代默认的print:
{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveAnyClass #-} import Data.Text (Text) import TextShow (TextShow, printT) import GHC.Generics (Generic) data Person = Person { name :: Text , age :: Int } deriving (Generic, TextShow) -- 自动生成支持UTF-8的TextShow实例 secondPerson :: Person secondPerson = Person { name = "हर्षल पाटील", age = 100 } main :: IO () main = do printT "Second Person" printT secondPerson
额外注意
确保你的终端已经设置为支持UTF-8编码,否则即使代码正确,也可能出现乱码。
内容的提问来源于stack exchange,提问作者Harshal Patil
相关产品推荐
相关产品推荐

