mna*_*mna 1 haskell utf-8 overloaded-strings
我意识到我的文本中的重音转换为 .我将其归结为以下示例,该示例写入(并覆盖)文件test.txt.
它只使用Data.Text中的方法,它们应该处理unicode文本.我检查了源文件和输出文件都是用utf8编码的.
{-# LANGUAGE OverloadedStrings #-}
import Prelude hiding (writeFile)
import Data.Text
import Data.Text.IO
someText :: Text
someText = "Université"
main :: IO ()
main = do
writeFile "test.txt" someText
Run Code Online (Sandbox Code Playgroud)
运行代码后,test.txt包含:Universit .在ghci中,我得到以下内容
*Main> someText
"Universit\233"
Run Code Online (Sandbox Code Playgroud)
这已编码不正确吗?我还在https://hackage.haskell.org/package/text-1.2.2.2/docs/Data-Text.html中找到了对 的评论 ,但我仍然不知道如何纠正上面的例子.
如何在OverloadedString中使用重音并正确地将它们写入文件?
这与没有任何关系Data.Text,当然也没有OverloadedStrings- 两者都处理UTF-8-Unicode就好了.
但是Data.Text.IO不会写BOM或任何指示编码的内容,即文件实际上只包含文本.在任何现代系统中,这意味着它将采用原始UTF-8形式:
sagemuej@sagemuej-X302LA:~$ xxd test.txt
00000000: 556e 6976 6572 7369 74c3 a9 Universit..
sagemuej@sagemuej-X302LA:~$ cat test.txt
Université
Run Code Online (Sandbox Code Playgroud)
因此,根据您打开文件的编辑器,可能会猜错编码,这显然是您的问题.在Linux上,UTF-8长期以来一直是标准,所以这里没有问题,但Windows并不是最新的.但是,应该可以在任何编辑器中手动选择编码.
实际上,Data.Text.IO.writeFile将使用您的语言环境来决定如何对文件进行编码.现在每个人都应该使用UTF-8作为他们的语言环境,如果你不这样做,请改变它.
要在文件中获取BOM并因此排除此类问题,请使用utf8_bom.
关于你在GHCi中看到的输出:那是Show工作中的实例; 它将任何类似字符串的值转换为最安全的可想象的形式,即任何不是转义序列的ASCII的东西,'é'恰好是'\233'.再次不具体Text,实际上即使是单个字符也可以获得:
Prelude> 'é'
'\233'
Prelude> putChar '\233'
é
Run Code Online (Sandbox Code Playgroud)
当您使用直接IO输出动作为您的字符串类型,即此转义永远不会发生putChar,putStr或putStrLn.
Prelude> import qualified Data.Text.IO as Txt
Prelude Txt> Txt.putStrLn "Université"
Université
Run Code Online (Sandbox Code Playgroud)