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