简单Haskell代码中的错误字符编码

简单Haskell代码中的错误字符编码,haskell,utf-8,character-encoding,Haskell,Utf 8,Character Encoding,我对haskell中的字符编码有问题。这个简单的程序写错误的结果。这里我真正感兴趣的是编码函数,它迫使我使用ByteString。申请表格为: import Data.ByteString.Char8 (unpack, pack) import Data.ByteString.Lazy (toStrict) import Data.Csv (encode) -- cabal install cassava main = do -- (middle character is polish

我对haskell中的字符编码有问题。这个简单的程序写错误的结果。这里我真正感兴趣的是编码函数,它迫使我使用ByteString。申请表格为:

import Data.ByteString.Char8 (unpack, pack)
import Data.ByteString.Lazy (toStrict)
import Data.Csv (encode) -- cabal install cassava

main = do
    -- (middle character is polish diacritic letter)
    putStrLn $ unpack $ pack "aća"
    putStrLn $ unpack $ toStrict $ encode ["aća"]
应该打印出来

aća
a,ć,a
但它却写了

aa
a,Ä,a
这破坏了我的应用程序编码CSV。无论我的语言环境设置如何,这种情况都会在Linux上发生

$ locale
LANG=pl_PL.UTF-8
LC_CTYPE="pl_PL.UTF-8"
LC_NUMERIC="pl_PL.UTF-8"
LC_TIME="pl_PL.UTF-8"
LC_COLLATE="pl_PL.UTF-8"
LC_MONETARY="pl_PL.UTF-8"
LC_MESSAGES="pl_PL.UTF-8"
LC_PAPER="pl_PL.UTF-8"
LC_NAME="pl_PL.UTF-8"
LC_ADDRESS="pl_PL.UTF-8"
LC_TELEPHONE="pl_PL.UTF-8"
LC_MEASUREMENT="pl_PL.UTF-8"
LC_IDENTIFICATION="pl_PL.UTF-8"
LC_ALL=pl_PL.UTF-8


我想知道的是如何将encode(Data.ByteString.Lazy.ByteString)的输出转换为字符串,这样我就可以使用writeFile函数将其写入文件。

您只需使用
Data.ByteString.Lazy.putStr
而不是
putstrn。打开toStrict
。无需查看
文本

Data.ByteString.Char8.unpack
将值为n的字节转换为值为n的Unicode代码点。不要在(非ASCII)UTF-8编码文本上使用它


编辑:我看到您说要将
encode
的结果转换为字符串,以便将其写入文件。不要这样做,而是使用诸如
Data.ByteString.Lazy.writeFile
之类的IO函数。

您应该只使用
Data.ByteString.Lazy.putStr
而不是
putstrn。打开toStrict
。无需查看
文本

Data.ByteString.Char8.unpack
将值为n的字节转换为值为n的Unicode代码点。不要在(非ASCII)UTF-8编码文本上使用它


编辑:我看到您说要将
encode
的结果转换为字符串,以便将其写入文件。不要这样做,而是使用诸如
Data.ByteString.Lazy.writeFile
之类的IO函数。

您应该只使用
Data.ByteString.Lazy.putStr
而不是
putstrn。打开toStrict
。无需查看
文本

Data.ByteString.Char8.unpack
将值为n的字节转换为值为n的Unicode代码点。不要在(非ASCII)UTF-8编码文本上使用它


编辑:我看到您说要将
encode
的结果转换为字符串,以便将其写入文件。不要这样做,而是使用诸如
Data.ByteString.Lazy.writeFile
之类的IO函数。

您应该只使用
Data.ByteString.Lazy.putStr
而不是
putstrn。打开toStrict
。无需查看
文本

Data.ByteString.Char8.unpack
将值为n的字节转换为值为n的Unicode代码点。不要在(非ASCII)UTF-8编码文本上使用它



编辑:我看到您说要将
encode
的结果转换为字符串,以便将其写入文件。不要这样做,而是使用诸如
Data.ByteString.Lazy.writeFile
之类的IO函数。

ByteString
不关心编码,它只读取字节。您尝试过使用
数据.Text
吗?@bheklillr我已经将import fot添加到字符串中。您想改用
Text
<代码>数据。ByteString将把任何
字符
截断为
字符8
。另外,要知道,在第二种情况下,您调用的是
编码
字符列表,而不是
ByteString
字符列表,因此它们实际上并不等价。我强烈建议在此应用程序中使用
Data.Text
而不是
Data.ByteString
。@Trismegistos查看从
ByteString
转换为正确的
Text
编码的函数。
ByteString
不关心编码,它只读取字节。您尝试过使用
数据.Text
吗?@bheklillr我已经将import fot添加到字符串中。您想改用
Text
<代码>数据。ByteString将把任何
字符
截断为
字符8
。另外,要知道,在第二种情况下,您调用的是
编码
字符列表,而不是
ByteString
字符列表,因此它们实际上并不等价。我强烈建议在此应用程序中使用
Data.Text
而不是
Data.ByteString
。@Trismegistos查看从
ByteString
转换为正确的
Text
编码的函数。
ByteString
不关心编码,它只读取字节。您尝试过使用
数据.Text
吗?@bheklillr我已经将import fot添加到字符串中。您想改用
Text
<代码>数据。ByteString将把任何
字符
截断为
字符8
。另外,要知道,在第二种情况下,您调用的是
编码
字符列表,而不是
ByteString
字符列表,因此它们实际上并不等价。我强烈建议在此应用程序中使用
Data.Text
而不是
Data.ByteString
。@Trismegistos查看从
ByteString
转换为正确的
Text
编码的函数。
ByteString
不关心编码,它只读取字节。您尝试过使用
数据.Text
吗?@bheklillr我已经将import fot添加到字符串中。您想改用
Text
<代码>数据。ByteString将把任何
字符
截断为
字符8
。另外,要知道,在第二种情况下,您调用的是
编码
字符列表,而不是
ByteString
字符列表,因此它们实际上并不等价。我强烈建议在此应用程序中使用
Data.Text
而不是
Data.ByteString
。@Trismegistos查看从
ByteString
转换为正确的
Text
编码的函数。这很有效,但如果我想将bytesting转换为字符串或文本以进一步处理它呢?@Trismegistos您应该这样做使用软件包
utf8 string
中的函数,文档位于,我认为默认情况下它是在Haskell平台上安装的。这很管用,但是如果我想通过测试将其转换为字符串或文本来处理它呢?@Trismegistos您应该使用func
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=