下载字符串的编码问题(UTF-8、ISO-8859-1、FSharp.Data)

Issues with encoding of a downloaded string (UTF-8, ISO-8859-1, FSharp.Data)

我正在使用 FSharp.Data 下载和解析 XML 文档。该文件包含几个北欧字符,例如:“Lempäälän Keskus”。我有一个像这样的简单代码:

open FSharp.Data
open System.IO

let xml = Http.RequestString(downloadUrl)
File.WriteAllText("response.xml", xml)

但是,当我打开生成的文件时,字符已损坏并且我看到了:“Lempäälän Keskus”。我曾尝试使用 ISO-8859-1 编码手动重新保存文件,然后使用 UTF-8(在 VS 代码中)重新打开。这修复了显示的文本。然后尝试实现一个简单的编码转换函数:

open FSharp.Data
open System
open System.IO

let convertEncoding (input: string) =
  let iso = Encoding.GetEncoding("ISO-8859-1")
  let utf8 = Encoding.UTF8
  let isoBytes = iso.GetBytes(input)
  let utfBytes = Encoding.Convert(iso, utf8, isoBytes)
  utf8.GetString(utfBytes)

let xml = Http.RequestString(downloadUrl)
let decoded = convertEncoding xml
File.WriteAllText("response.xml", decoded)

但是,当我打开文件时,我仍然看到“Lempääälän Keskus”而不是“Lempäälän Keskus”。我做错了什么?

将文本写入文件时提供编码

let encoding = Encoding.GetEncoding("ISO-8859-1")
File.WriteAllText("response.xml", xml, encoding)

实际上,这似乎是 FSharp.Data 库中的 Http 客户端引起的奇怪行为。我不确定这是一个错误,还是我还没有找到相关文档的功能。

System.Net.Http.HttpClient替换FSharp.Data.Http客户端就足够了。突然间,所有的编码错误都消失了,不需要任何转换。这是一个示例解决方案:

open System
open System.IO
open System.Net.Http

let download (url: string) = 
  async {
    use client = new HttpClient()
    let! xml = client.GetStringAsync(url) 
                |> Async.AwaitTask
    return xml
  }

let result = download url |> Async.RunSynchronously
File.WriteAllText("response.xml", result)