【问题标题】:Backslash read and write and F# interactive console反斜杠读写和 F# 交互控制台
【发布时间】:2011-01-24 18:21:17
【问题描述】:

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

例如

let toto = "Adelaide Gu\u00e9nard" 

toto;;

交互式窗口打印“Adelaide Guénard”。

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

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

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

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

【问题讨论】:

  • 听起来您的文本文件包含一个反斜杠和一个“u”以及其中的一些数字,是吗?而且我猜您想像 F# 字符串文字一样“解释”这些字符? (只是想澄清问题,我不知道答案。)
  • @Brian 我编辑了这个问题。谢谢

标签: f#


【解决方案1】:

据我所知,没有可以为您解码 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# 编译器会解释转义)

【讨论】:

    【解决方案2】:

    它使用来自 F# PowerPack 的 StructuredFormat 东西。对于您的字符串,它实际上是在执行printfn toto;;

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

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

    File.WriteAllText 使用的默认编码是 UTF-8。您应该可以在记事本或 Visual Studio 中打开 toto.txt 并正确看到 é。

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

    看起来 fsi 在打印 test.txt 的内容时太聪明了。它将其格式化为有效的 F# 表达式,并带有引号、[| |] 括号和 Unicode 字符转义。 File.ReadAllLines 返回的字符串不包含任何这些内容;它只包含 Adelaide Guénard 字样。

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

    【讨论】:

    • 感谢蒂姆的回答,我编辑了我的问题以进一步说明我的问题。
    • 所以我尝试了 ReadAllLines,然后是 WriteAllLines。它不起作用。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2015-01-27
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多