You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:20:27