C#读取UTF8 XML存入MySQL的编码乱码问题求助
解决UTF8 XML读取及MySQL存储乱码问题
1. 修正文件读取与编码转换逻辑
你的XML文件为UTF8编码,需用对应编码读取,且必须移除所有多余的编码转换操作——C#的string本质是Unicode(UTF-16),直接使用解析后的字符串即可,反复转字节再解码会直接破坏字符编码。
修改读取解析代码:
foreach (string file in Directory.EnumerateFiles(@"C:\xml_folder\" + sub_folder, "*.xml")) { // 直接用XDocument.Load读取文件,自动识别XML声明中的编码,比先读文本再解析更可靠 var document = XDocument.Load(file); foreach (var child in document.Root.Elements("result")) { string name_it = ""; string name_en = ""; string name_ru = ""; // 其他语言变量初始化... foreach (var translationsChild in child.Elements("translations")) { string lang = translationsChild.Element("language")?.Value ?? ""; string nameValue = translationsChild.Element("name")?.Value ?? ""; switch (lang) { case "it": name_it = nameValue; // 直接赋值,无需任何编码转换 break; case "en-gb": name_en = nameValue; break; case "ru": name_ru = nameValue; break; // 其他语言分支... } } // 后续数据库插入逻辑 } }
2. 配置数据库连接字符集
MySQL连接时必须明确指定字符集,否则即使字段编码正确,连接默认编码不匹配也会导致乱码。在连接字符串中添加CharSet=utf8mb4(推荐,兼容所有Unicode字符)或CharSet=utf8:
string connString = "server=localhost;database=your_db;user=root;password=your_pwd;CharSet=utf8mb4;";
注:MySQL的
utf8实际是utf8mb3,仅支持Unicode基本平面字符;utf8mb4支持全量Unicode字符,兼容性更强。
3. 确认表字段编码兼容性
虽然你提到字段为utf8_general_ci,可通过SQL语句再次验证并升级编码(可选但推荐):
ALTER TABLE cities MODIFY COLUMN name_it VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE cities MODIFY COLUMN name_ru VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
4. 调试与验证
插入数据库前,先在控制台输出变量值确认解析结果正确。若控制台显示乱码,可临时修改控制台编码:
Console.OutputEncoding = Encoding.UTF8;
内容的提问来源于stack exchange,提问作者user21611183
相关产品推荐
相关产品推荐

