2011-01-24 9 views
2

編集:ファイルからバックスラッシュを読み込んで対話型ウィンドウに書き込むのと対話式ウィンドウに直接書き込む対比の違いは何ですか?例えばバックスラッシュの読み書きとF#対話型コンソール

let toto = "Adelaide Gu\u00e9nard" 

toto;; 

対話型のウィンドウ版画 "アデレードGuénard"。

これで、1行のAdelaide Gu \ u00e9nardでtxtファイルを保存するとします。そして、それを読ん:

System.IO.File.ReadAllLines(@"test.txt") 

対話型のウィンドウを印刷[|「アデレード区の\ u00e9nard」|]

を対話型のウィンドウ印刷の面でこれらの2文の違いは何ですか?

+0

テキストファイルにバックスラッシュと 'u'といくつかの数字が含まれているように聞こえますか?そして、あなたはF#文字列リテラルのようなそれらの文字を '解釈'したいと思いますか? (ちょうど質問を明らかにするために、私は答えを知らない。) – Brian

+0

@ブライアン私は質問を編集しました。ありがとう – jlezard

答えて

4

私が知る限り、F#/ C#の文字列のエスケープをデコードするライブラリはありませんので、自分でその機能を実装する必要があります。正規表現を使用する解決策を使用してhow to do that in C#に同様の質問がありました。

あなたは、このようなF#のにそれを書き換えることができます:

open System 
open System.Globalization 
open System.Text.RegularExpressions 

let regex = new Regex (@"\\[uU]([0-9A-F]{4})", RegexOptions.IgnoreCase) 
let line = "Adelaide Gu\\u00e9nard" 
let line = regex.Replace(line, fun (m:Match) -> 
    (char (Int32.Parse(m.Groups.[1].Value, NumberStyles.HexNumber))).ToString()) 

(あなたが"some\\u00e9etc"を記述する場合、あなたはあなたがテキストファイルから読んだものと同じものを含む文字列を作成している - あなたが使用している場合単一のバックスラッシュでF#コンパイラがエスケープを解釈する)

+0

私はそれを今、感謝してクール – jlezard

3

これはF#PowerPackのStructuredFormatのものを使用しています。あなたの文字列については、効果的にprintfn toto;;をやっています。次のように

はテキストファイルで同じ動作を実現することができます

open System.IO;; 
File.WriteAllText("toto.txt", toto);; 

File.WriteAllTextで使用されるデフォルトのエンコーディングはUTF-8です。メモ帳やVisual Studioでtoto.txtを開き、éが正しく表示されるはずです。

編集:クリーンF#インタラクティブ印刷で別のファイルにあるtest.txtの内容を書きたい場合は、私はどのように進むのでしょうか?

test.txtの内容を印刷するときにfsiが巧妙すぎるようです。これは、有効なF#式として書式設定されており、引用符、[| |]かっこ、およびUnicode文字のエスケープがあります。 File.ReadAllLinesによって返された文字列には、これらのものは含まれていません。それはちょうどアデレードGuénardという言葉を含んでいます。

File.ReadAllLinesによって返された配列を受け取り、内容がマングリングされずにFile.WriteAllLinesに渡すことができるはずです。

+0

私はより多くの私の問題を説明するために私の質問を編集した答えティム私は感謝します。 – jlezard

+0

だから私はReadAllLinesとWriteAllLinesを試しました。それは動作しません。助けをありがとう – jlezard

関連する問題