簡體   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