gpt4 book ai didi

haskell - 如何在 Haskell for CGI 中使用格式化打印来显示 UTF-8?

转载 作者:行者123 更新时间:2023-12-02 17:11:03 24 4
gpt4 key购买 nike

我有一个代码

module Main where

import Text.Printf

main = printf "%s%s" ("Content-type: text/html; charset=utf-8\n\n" :: String ) ("And немного русского" :: String)

如果我在终端中执行它,我就会得到我想要的:

Content-type: text/html; charset=utf-8

And немного русского

但是当我尝试将其作为 cgi 程序执行时,我只有 And (因为在这个词之后我有西里尔字符,并且它们不想显示)。

当我使用 Data.ByteString.Char8Data.ByteString.UTF8 中的 putStr $ fromString 时,没有问题,所以我不要认为我的 LAMPP 服务器有问题。我还在 httpd.conf 中添加了 AddDefaultCharset utf-8

而我真正想要做的是读取带有特殊符号的模板文件,例如 %s%d 等,然后在printf,根据查询字符串和显示,将它们(符号)替换为我需要的内容。

我这样做只是为了好玩,我希望这个问题只能用纯 Haskell 来解决。

最佳答案

CGI 程序可能适合也可能不适合,具体取决于区域设置;例如如果生成的 HTML 有一个编码 header 表明它是 UTF-8,那么您应该独立于系统区域设置生成 UTF-8。

与语言环境无关的方法是在向标准输出打印任何内容之前设置标准输出的编码:

import System.IO

main = do
hSetEncoding stdout utf8
printf "%s%s" ("Content-type: text/html; charset=utf-8\n\n" :: String ) ("And немного русского" :: String)

您的代码:

/tmp $ echo $LANG
de_DE.utf8
/tmp $ ./Test2
Content-type: text/html; charset=utf-8

And немного русского
/tmp $ LANG=C ./Test2
Content-type: text/html; charset=utf-8

And Test2: <stdout>: commitBuffer: invalid argument (invalid character)

修改后的代码:

/tmp $ ./Test2
Content-type: text/html; charset=utf-8

And немного русского
/tmp $ LANG=C ./Test2
Content-type: text/html; charset=utf-8

And немного русского

关于haskell - 如何在 Haskell for CGI 中使用格式化打印来显示 UTF-8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11617639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com