繁体   English   中英

utf8和Haskell中的重载字符串

[英]Utf8 and overloaded strings in Haskell

我意识到我的文字中的重音会转换为``。 我将其归结为以下示例,该示例写入(并覆盖)文件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

运行代码后,test.txt包含:大学。 在ghci中,我得到以下内容

*Main> someText
"Universit\233"

这已经编码不正确了吗? 我还在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é

因此,取决于打开文件的编辑器,它可能会猜测编码错误,这显然是您的问题。 在Linux上,UTF-8长期以来一直是标准,因此这里没有问题,但是Windows并不是最新的。 不过,应该可以在任何编辑器中手动选择编码。

实际上, Data.Text.IO.writeFile将使用您的语言环境来决定如何对文件进行编码。 如今, 每个人都应该将UTF-8作为其语言环境,如果您不希望更改的话。

要在文件中获取BOM表并避免此类问题,请使用utf8_bom

关于在GHCi中看到的输出:这是Show实例在起作用; 它会将所有类似于字符串的值都转义为最安全的形式,即转义序列'é' ASCII的任何内容(对于'é'恰好是'\\233' 再次不特定于Text ,实际上,即使对于单个字符,您也可以得到以下信息:

Prelude> 'é'
'\233'
Prelude> putChar '\233'
é

当您对字符串类型(即putCharputStrputStrLn使用直接IO输出操作时,这种转义永远不会发生。

Prelude> import qualified Data.Text.IO as Txt
Prelude Txt> Txt.putStrLn "Université"
Université

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM