Sto usando un DbContext (MySql.Data.EntityFrameworkCore 6.10.6) su un progetto WebAPI (.NET Core 2.0) per un po 'senza problemi, ma ora ho bisogno di usare lo stesso contesto su un'applicazione Console e caratteri speciali non vengono caricati correttamente.
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"
}
}
App Console:
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"
}
Perché questi valori sono diversi anche se viene utilizzato lo stesso contesto?
Aggiornamento 1: la modifica di Console.OutputEncoding in UTF8 o la modifica del font della console su Console o Console di Lucida non ha modificato il risultato. Il vero scopo dell'app Console è chiamare un'API e il risultato ha il carattere � non appena recupero il valore dal DB durante il debug. Non è necessario stampare il risultato sulla console.
Aggiornamento 2: quando si esegue il debug oltre la variabile productName
, il valore non cambia quando si chiama productName
o ?productName
nella finestra immediata da Visual Studio.
Aggiornamento 3: ho configurato un database di test utilizzando MS SQL Server e i caratteri sono stati caricati correttamente. Sembra che sia un problema con MySql.Data.EntityFrameworkCore
Aggiornamento 4: testato con una nuova app console utilizzando .NET Framework 4.7.1 e i caratteri vengono visualizzati correttamente.
La soluzione era aggiungere questa linea all'app della console.
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Riferimento: https://github.com/dotnet/corefx/issues/10054
Prova ad aggiungerlo per far caricare correttamente i caratteri speciali.
Console.OutputEncoding = System.Text.Encoding.Unicode;