为什么来自db的值在Console Apps和WebAPI上的加载方式不同?

时间:2018-02-12 22:17:03

标签: c# mysql .net-core entity-framework-core

我已经在WebAPI项目(.NET Core 2.0)上使用了DbContext(MySql.Data.EntityFrameworkCore 6.10.6)很长一段时间没有任何问题但现在我需要在一个上使用相同的上下文控制台应用程序和特殊字符未正确加载。

的WebAPI:

public class ProductsController : Controller
{
    private readonly MyDbContext _context;

    public ProductsController(MyDbContext context)
    {
        _context = context;
    }

    [HttpGet]
    public string Get()
    {
        var productName = _context.Products
            .Single(x => x.Id == 1)
            .Name;

        return productName; = // "PÃO FRANCÊS"
    }
}

控制台应用

private static void Main(string[] args)
{
    // setup DI
    Initialize();

    var context = ServiceProvider.GetService<MyDbContext>();

    var productName = context.Products
        .Single(x => x.Id == 1)
        .Name;

    Console.WriteLine(productName); // "P�O FRANC�S"
}

即使使用相同的上下文,为什么这些值会有所不同?

更新1: 将Console.OutputEncoding更改为UTF8或将控制台字体更改为Lucidas控制台或控制台并未更改结果。控制台应用程序的真正目的是调用API,并在调试时从数据库中检索值时结果具有�字符。我不需要在控制台上打印结果。

更新2: 在调试productName变量之后,从Visual Studio调用立即窗口中的productName?productName时,值不会发生变化。

更新3: 我已使用MS SQL Server配置了测试数据库,并且正确加载了字符。看起来它是MySql.Data.EntityFrameworkCore的问题

更新4: 使用.NET Framework 4.7.1使用新的控制台应用程序对其进行测试,并正确显示字符。

2 个答案:

答案 0 :(得分:2)

解决方案是将此行添加到控制台应用程序。

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

参考:https://github.com/dotnet/corefx/issues/10054

答案 1 :(得分:0)

尝试添加此选项以正确加载特殊字符。

Console.OutputEncoding = System.Text.Encoding.Unicode;