下载字符串的编码问题(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)
我正在使用 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)