反斜杠读写和F#交互式控制台

时间:2011-01-24 18:21:18

标签: f#

编辑:从文件中读取反斜杠并将其写入交互式窗口与直接将字符串写入交互式窗口之间的区别是什么?

例如

let toto = "Adelaide Gu\u00e9nard" 

toto;;

交互式窗口打印出“AdelaideGuénard”。

现在,如果我使用单行Adelaide Gu \ u00e9nard保存txt文件。阅读:

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

交互式窗口打印[|“Adelaide Gu \ u00e9nard”|]

这两个声明在交互式窗口打印方面有什么区别?

2 个答案:

答案 0 :(得分: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#编译器会解释转义)

答案 1 :(得分: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返回的字符串不包含任何这些内容;它只包含AdelaideGuénard的字样。

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

相关问题