2017-08-27 6 views
1

私のテキストのアクセントは に変換されることに気付きました。 私はそれを次の例に煮詰めました。この例では、 はtest.txtというファイルを書き込みます(上書きします)。HaskellのUtf8とオーバーロードされた文字列

ユニコードテキストを扱うために とされているData.Textのメソッドを排他的に使用します。ソースファイル と出力ファイルの両方が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、 のcommentにコメントを見つけましたが、上記の例を修正する方法はまだ分かりません。

どのようにしてアクセントをOverloadedStringで使用し、正しくファイルに書き込むことができますか?

+0

文字列は(と私は信じているだけでなくテキスト)「面白い」文字をエスケープした後に印刷されています。これが行われ、ユーザが 'どこ' show'はエスケープん 'putStrLn(ショーの文字列)入力されたかのように引用符を追加します。 'putStrLn string'で裸の文字列/テキストを出力することができます(preludeの代わりに' Data.Text.putStrLn'をテキストに使用してください)。 – chi

+0

ghciのputStrLnがアクセントを正しく示しているので、writeFileでなければなりませんか? – mna

答えて

5

これはData.Textとはまったく関係がありません。確かにOverloadedStringsではなく、どちらもUTF-8ユニコードをうまく処理します。

Data.Text.IOは、BOMなどのエンコードを示すものではありません。つまり、ファイルには実際にそのままの状態のテキストが含まれています。

[email protected]:~$ xxd test.txt 
00000000: 556e 6976 6572 7369 74c3 a9    Universit.. 
[email protected]:~$ cat test.txt 
Université 

だから、あなたが持つファイルを開くどのエディタによっては、それは間違ったエンコーディングを推測することができ、それは明らかにあなたの問題だ:任意の近代的なシステムでは、これは、生のUTF-8形式であることを意味します。 Linuxでは、UTF-8は長い間標準であったため、ここでは問題はありませんが、Windowsはそれほど最新ではありません。ただし、任意のエディタでエンコーディングを手動で選択することは可能です。

実際には、Data.Text.IO.writeFilelocaleを使用してファイルのエンコード方法を決定します。現在はロケールとしてEverybody should have UTF-8となっていますが、変更しない場合は変更してください。

ファイル内にBOMを取得し、このような問題を回避するには、utf8_bomを使用してください。

GHCiに表示されている出力については、それはShowインスタンスです。それは文字列のような値を最も安全な考えられる形式、つまりエスケープシーケンスのASCIIでないものにエスケープします。は'\233'です。ここでも、特定のではないTextに、実際にあなたも、単一の文字のためにこれを取得する:あなたは文字列型のために直接-IO-出力アクションを使用する場合

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

このエスケープが発生したことがない、すなわちputCharputStrまたはputStrLnを。 GHCiの中

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

私はエディタでtest.txtを開き、エンコーディングを手動でutf8に設定しました。それでも私はアクセントを得ていない。 writeFileがどのようなエンコーディングを使用しているかをどのように知ることができます – mna

+0

私はそれがいつもUTF-8だと思っていましたが、[ドキュメントに従って](http://hackage.haskell.org/package/text-1.2.2.2/docs/Data-Text-IO.html#g:2)実際にあなたのロケールを使用して決定します。あなたのロケールをUTF-8に設定することを強くお勧めします。代わりに、もちろん、好きなエンコーディングでバイトコードを作成することもできます(まあ、最近は(UTF-8以外は何も使用しないでください)(http://utf8everywhere.org/)...)。 – leftaroundabout

+0

実際、私のスタックのhaskellインストール用のロケールはutf8に設定されていません。どのように変更するのか分かりませんが、コード内で "setLocaleEncoding utf8"を使用して変更することができます。 – mna

関連する問題