首页 > 解决方案 > .net核心类库中的不同字符编码

问题描述

我正在开发一个 API,并且遇到了字符编码的问题。在运行 .NET Core 2.1 的解决方案中考虑以下两个项目:

这是我在 Web 中的控制器的代码

[HttpGet("text")]
public async Task<JsonResult> GetText()
{
    string culture = CultureInfo.CurrentCulture.DisplayName;
    string encoding = Encoding.Default.ToString();

    string controllerText = culture + " " + encoding + " åäö";
    string serviceText = await _slotService.GetText();

    return _responseBuilder.Success("ControllerText: " + 
    controllerText + " ServiceText: " + serviceText);
}

这是我的服务中的代码:

    public async Task<string> GetText()
    {
        string culture = CultureInfo.CurrentCulture.DisplayName;
        string encoding = Encoding.Default.ToString();
        return culture + " " + encoding + " åäö";
    }

当我从邮递员那里调用这个 api 时,我得到以下结果:

{
    "message": "ControllerText: sv (SE) 
    System.Text.UTF8Encoding+UTF8EncodingSealed åäö ServiceText: sv 
    (SE) System.Text.UTF8Encoding+UTF8EncodingSealed 
    \ufffd\ufffd\ufffd"
}

为什么控制器和服务会为“åäö”字符提供不同的结果?尽管它们似乎具有相同的文化和编码。它必须与他们在不同的项目(Web 项目和类库)中创建字符串有关。

标签: c#asp.net-corecharacter-encodingasp.net-core-webapi

解决方案


好的,所以我终于想通了。

问题在于 Visual Studio 中的文件编码。我的第一个文件保存为 Unicode,而服务项目中的第二个文件保存为 ANSI。似乎您无法在 Visual Studio 中设置关于始终保存为何种编码的任何选项。这是从您的 Windows 语言设置中选择的。

我通过以下步骤解决了这个问题:

  1. 转到Tools -> Options -> Environment -> Documents并选中“无法在代码页中保存时将文档另存为 Unicode”

  2. 在您的项目文件夹中运行以下命令:

    Get-ChildItem *.cs -Recurse | ForEach-
    $content = $_ | Get-Content
    Set-Content -PassThru $_.Fullname $content -Encoding UTF8 -Force} 
    
  3. 在您的解决方案中搜索并替换 unicode 字符替换字符 �,然后将其换成正确的字符。

也许不是最佳方法,但它解决了问题!


推荐阅读