Razor页面赋值特殊字符编码错乱,MySQL存储显示为�
排查方向与解决办法
既然你已经排除了数据库本身和EF配置的问题,而且PHP插入正常,那问题确实大概率出在Razor页面到.NET代码的字符传递环节,下面是几个针对性的排查和解决方向:
1. 检查Razor文件的保存编码
硬编码在.razor文件里的特殊字符(比如"Garçon")如果文件本身不是以UTF-8编码保存,编译时就会变成乱码。
- 在Visual Studio中:右键你的
Create.razor文件 → 属性 → 高级保存选项,确认编码选择的是UTF-8(带不带BOM都可以,但必须是UTF-8,不能是ANSI或其他编码)。 - 其他编辑器(比如VS Code):确保右下角显示的编码是UTF-8,若不是,点击编码选择"通过UTF-8重新打开"并保存。
2. 验证硬编码字符串的实际值
在你的AddEntry方法里添加调试代码,确认变量赋值后的字符串是否真的正确:
void AddEntry() { UserModel waitress = new UserModel(); waitress.Username = "Garçon"; // 调试输出:查看字符串的字节序列和实际值 var bytes = System.Text.Encoding.UTF8.GetBytes(waitress.Username); Console.WriteLine($"Username: {waitress.Username}, Bytes: {BitConverter.ToString(bytes)}"); // 其余代码略 }
正常情况下,ç的UTF-8字节是C3-A7,õ是C3-B5。如果输出的字节不对,说明字符串在赋值时就已经乱码了,根源就是文件编码问题。
3. 强制项目编译时使用UTF-8
有些情况下,系统默认编码会影响.NET项目对源文件的读取,你可以在项目文件(.csproj)中添加以下配置,强制编译器用UTF-8处理所有源文件:
<PropertyGroup> <LangVersion>latest</LangVersion> <CodePage>65001</CodePage> </PropertyGroup>
添加后重新编译项目,再测试插入特殊字符。
4. 使用Unicode转义序列替代硬编码(测试用)
如果怀疑硬编码的字符有问题,可以暂时用Unicode转义序列赋值,比如:
waitress.Username = "Gar\u00E7on"; // \u00E7 对应字符 ç
如果这样插入数据库后显示正常,就可以确定是源文件编码导致的硬编码字符串乱码。
5. 检查EF Core发送的SQL参数值
开启EF Core的日志功能,查看实际发送到MySQL的SQL参数是否正确:
在DatabaseContext的OnConfiguring方法中添加日志配置:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder .UseMySQL(Configuration.GetSection("AppSettings").GetSection("Database").GetSection("ConnectionString")["MySQL"]) .LogTo(Console.WriteLine, Microsoft.Extensions.Logging.LogLevel.Information); }
运行程序后,查看控制台输出的SQL语句,确认Username参数的值是否是正确的特殊字符。如果参数值已经乱码,问题在EF之前的环节;如果参数值正确,那可能需要再次确认MySQL连接器的版本(建议使用最新稳定版的Pomelo连接器)。
内容的提问来源于stack exchange,提问作者Michel Arendt
相关产品推荐
相关产品推荐

