[英]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'
é
當您對字符串類型(即putChar
, putStr
或putStrLn
使用直接IO輸出操作時,這種轉義永遠不會發生。
Prelude> import qualified Data.Text.IO as Txt
Prelude Txt> Txt.putStrLn "Université"
Université
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.