【问题标题】:Issues with encoding of a downloaded string (UTF-8, ISO-8859-1, FSharp.Data)下载字符串的编码问题(UTF-8、ISO-8859-1、FSharp.Data)
【发布时间】:2021-01-15 14:11:50
【问题描述】:

我正在使用 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 Code 中)重新打开。这修复了显示的文本。然后尝试实现一个简单的编码转换函数:

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”。我做错了什么?

【问题讨论】:

    标签: xml utf-8 f# f#-data


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,但最终我想将字符串保存到数据库中。是否可以将其转换为内存中已有的正确格式?
    • @Storm 这取决于您要使用的数据库。但我建议你使用 UTF-8
    • 顺便说一句,您的编码转换代码是正确的。很可能您使用打开 UTF-8 文件的工具有问题。确保它配置为 UTF-8 和可变字符宽度集(如果有这样的设置)
    【解决方案2】:

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

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-04
      • 2012-05-27
      • 2012-09-04
      • 2021-05-15
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多