将不正确编码的字符串(例如,"ñ")转换为ISO-8859-1 (Latin1

本文关键字:quot #177 转换 Latin1 ISO-8859-1 #195 不正确 例如 编码 字符串 | 更新日期: 2023-09-27 18:06:17

不涉及太多细节,我有一个c# WCF应用程序,它是我正在调用的基于XML的API的包装器。该API返回一个字符串,它实际上只是一个XML文档。然后解析该XML并返回它。返回的信息以JSON的形式显示在浏览器中。

有点令人困惑,但这里是一些示例代码:

[OperationContract]
[WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare,
    ResponseFormat = WebMessageFormat.Json, UriTemplate = "/TestGetUser")]
TestGetUserResponse TestGetUser();
/* ... */
[DataContract(Namespace = "http://schema.mytestdomain/", Name = "TestGetUser")]
public class TestGetUserResponse
{
    [DataMember]
    public User User { get; set; }
    [DataMember]
    public Error Error { get; set; }
}

TestGetUser为:

public TestGetUserResponse TestGetUser() {
    WebClient client = getCredentials(); // getCredentials() method is defined elsewhere
    string apiUrl = "http://my.api.url.com/API";
    string apiRequest = "<?xml version='1.0' encoding='utf-8' ?><test>My XML Request Lives Here</test>";
    
    string result = client.UploadString(apiUrl, apiRequest);
    
    XmlDocument user = new XmlDocument();
    user.LoadXml(result);
    
    userNode = user.SelectSingleNode("/my[1]/xpath[1]/user[1]");
    
    return new TestGetUserResponse {
        Error = new Error(),
        User = new User {
            Name = userNode.SelectSingleNode("name[1]").InnerText,
            Email = userNode.SelectSingleNode("email[1]").InnerText,
            ID = System.Convert.ToInt32(userNode.SelectSingleNode("id[1]").InnerText)
        }
    };
}

所以,当我从浏览器中点击URL时,它返回一个JSON字符串,如下所示:

{
    "Error": {
        "ErrorCode": 0,
        "ErrorDetail": null,
        "ErrorMessage":"Success"
    },
    "User": {
        "Name": "John Smith",
        "Email": "john.smith@example.com",
        "ID": 12345
    }
}

现在,我的问题是,有时返回的字符串(直接从API)是一个编码糟糕的UTF-8字符串(我认为?我可能会得到这个有点错)。例如,我可以返回:

{
    "Error": {
        "ErrorCode": 0,
        "ErrorDetail": null,
        "ErrorMessage":"Success"
    },
    "User": {
        "Name": "Jose Nuñez",
        "Email": "jose.nunez@example.com",
        "ID": 54321
    }
}

注意User对象下的Name属性中的ñ

我的问题是,我如何将这个不正确编码的字符串转换为ñ,这是它应该是什么?

我发现了一堆帖子

  • 数据库文本中的奇怪字符:Ã,Ã,¢,â,€,
  • 如何转换这些奇怪的字符?(& # 195; & # 171; & # 195;, & # 195; & # 172;, & # 195; & # 185;, & # 195;)
  • c# UTF8解码,返回字节/数字而不是字符串
  • 如何解码"=?utf-8?B?…?="c#
  • 如何转换(音译)字符串从utf8到ASCII(单字节)在c#?
  • MOST PROMISING c#将字符串从UTF-8转换为ISO-8859-1 (latin) H

但似乎没有一个是我所需要的,或者试图借鉴那些帖子失败了。

所以,为了使我的问题尽可能简单,

如果我在c#中有一个变量。NET 3.5)应用程序,当我把它写出来的屏幕得到写为'ñ',我怎么能'重新编码';(可能是错误的词),使其输出为'ñ'?

将不正确编码的字符串(例如,"ñ")转换为ISO-8859-1 (Latin1

理想情况下,这将在您正在调用的api中修复,因此它将返回预期的编码。但是你应该能够这样修复它:

byte[] bytes = Encoding.GetEncoding(1252).GetBytes(Name);
var nameFixed = Encoding.UTF8.GetString(bytes);

编码1252为Windows-1252编码