3

テキストのエンコードに問題があります。Webサイトを解析すると、Data.Text文字列が表示されます

"プロジェクト-Fran\195 \ 167ois Dubois"、

これをファイルに書き込む必要があります。そのため、Data.Text.Lazy.Encoding.encodeUtf8を使用してBytestringに変換しています。問題は、これにより出力が文字化けすることです。

「プロジェクト-FrançoisDubois」。

ここで何が欠けていますか?

4

2 に答える 2

5

Fran\195\167oisの中に入ると、 UTF Data.Text-8でエンコードされたがすでにありますFrançois

Data.Text[.Lazy]これは、UTF-16でエンコードされたテキストであると想定されており、2つのコードユニット195と167がそれぞれユニコードコードポイント195として解釈されるため、不便です。'Ã'respである167。'§'。テキストをUTF-8でエンコードすると、これらはバイトシーケンスまたはバイトシーケンスに変換されc383 ([195,131])ますc2a7 ([194,167])

この状況に陥る可能性が最も高い方法は、Webサイトから取得したデータがUTF-8エンコードであるが、ISO-8859-1(Latin 1)エンコード(または別の8ビットエンコード;8859-15は広く普及しています)。

それを処理する適切な方法は、状況を完全に回避することです[残念ながら、それは不可能かもしれません]。

データのソースがそのエンコーディングを正しく記述している場合(Webサイトのように)、エンコーディングを見つけて、それに応じてデータを解釈します。間違ったエンコーディングが記述されている場合、もちろん運が悪いです。エンコーディングが指定されていない場合は、正しく推測する必要があります(少なくとも、ラテンアルファベットのバリアントを使用する言語では、最近の自然な推測はUTF-8です)。


状況を回避できない場合、それを修正する最も簡単な方法は次のとおりです。

  1. エンコードする前に、問題のあるシーケンスの発生を目的のシーケンスに置き換えます。

    encodeUtf8 $ replace (pack "Fran\195\167ois") (pack "Fran\231ois") contents
    
  2. 他のすべてがASCIIまたは不注意なUTF-8であると仮定して、Textコード単位をバイトとして解釈します。

    Data.ByteString.Lazy.Char8.pack $ Data.Text.Lazy.unpack contents
    

前者の方が効率的ですが、さまざまな誤エンコードがある場合(たとえば、アクセント付きの文字が異なるため)、不便になります。後者は、想定される状況(で255を超えるコードユニットがないText)でのみ機能し、長いテキストにはかなり非効率的です。

于 2012-04-08T10:05:17.613 に答える
0

lessUTF-8でエンコードされた文字を正しく表示できるかどうかは完全にはわかりません。GVimはできます。SOでこのリンクをチェックして、gVimでUTF-8データを表示する方法を確認できます。

そして、これをgraphvizに渡すことができるという他の問題に関しては、 Graph NonAscii FAQで説明されているように、コマンドラインでエンコーディングを設定する必要があると思います。

あなたが説明していることから、データがどのように保持されているかについては問題はないと思います。エンコーディングをgraphvizに適切に渡すと、問題は解決すると思います。

PS:説明的なリンクを作成する方が簡単なので、答えを作成します

于 2012-04-08T06:22:26.433 に答える