2011-01-24 53 views
2

编辑:从文件中读取反斜杠并将其写入交互式窗口与直接将字符串写入交互式窗口之间有什么区别?反斜杠读写和F#交互式控制台

例如

let toto = "Adelaide Gu\u00e9nard" 

toto;; 

交互式窗口打印 “阿德莱德Guénard”。

现在,如果我保存与单行阿德莱德Guünnard的txt文件。而在阅读:

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

交互式窗口打印[|“阿德莱德顾\ u00e9nard” |]

是什么在交互式窗口打印方面这2个语句之间的区别?

+0

这听起来像你的文本文件中包含反斜杠和'u'和一些数字,是吗?我想你想'解释'这些字符就像一个F#字符串字面值? (试图澄清问题,我不知道答案。) – Brian 2011-01-24 19:20:18

+0

@Brian我编辑了这个问题。谢谢 – jlezard 2011-01-24 20:30:33

回答

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#编译器解释转义)

3

它使用F#PowerPack中的StructuredFormat。对于你的字符串,它实际上是printfn toto;;

您可以在文本文件中实现相同的行为如下:

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

通过File.WriteAllText使用的默认编码为UTF-8。您应该能够在记事本或Visual Studio中打开toto.txt,并正确地看到é。

编辑:如果要将test.txt的内容写入干净的F#交互式打印中的另一个文件,我将如何继续?

打印test.txt的内容时,看起来fsi太聪明了。它将其格式化为一个有效的F#表达式,其中包含引号,括号括起来以及Unicode字符转义。由File.ReadAllLines返回的字符串不包含任何这些东西;它只包含文字阿德莱德Guénard

您应该能够将File.ReadAllLines返回的数组传递给File.WriteAllLines,而不会损坏内容。

+0

谢谢你的回答蒂姆我编辑我的问题来说明更多我的问题。 – jlezard 2011-01-24 18:39:06