FDConnection+ODBC读取Excel非英文字符显示???的解决方法问询
解决Delphi 10.4.2中FireDAC通过ODBC读取Excel非英文字符乱码问题
针对你遇到的俄文、格鲁吉亚文等非英文字符读取后显示为???的问题,核心原因是旧版Excel ODBC驱动(odbcjt32.dll)对Unicode支持不足,结合FireDAC的参数调整,可通过以下步骤解决:
1. 更换为ACE ODBC驱动
你当前使用的Microsoft Excel Driver (*.xls)是旧版ANSI驱动,建议替换为Microsoft Access Database Engine(ACE)驱动,该驱动原生支持Unicode和新版Excel格式(xlsx/xlsm等):
- 确保已安装32位版本的Microsoft Access Database Engine 2016/2021(因你的Delphi程序是32位,驱动位数必须匹配);
- 在FDConnection的参数中,将
ODBCDriver设置为Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)。
2. 调整FireDAC连接参数
除已设置的OpenMode=CreateUTF16和StringFormat=Unicode外,需添加以下关键参数:
ODBCAdvanced:指定字符集和扩展ANSI SQL支持,确保Unicode字符正确传输;ExtendedAnsiSQL=1:启用驱动的扩展ANSI SQL功能,提升Unicode兼容性。
修改后的完整连接代码示例:
FDConnection1.Connected := false; FDConnection1.Params.Clear; // 基础连接参数 FDConnection1.Params.Values['DriverID'] := 'ODBC'; FDConnection1.Params.Values['Database'] := 'D:\Delphi Projects\Excel\DB\myData.xls'; FDConnection1.Params.Values['ODBCDriver'] := 'Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)'; // Unicode相关设置 FDConnection1.Params.Values['OpenMode'] := 'CreateUTF16'; FDConnection1.Params.Values['StringFormat'] := 'Unicode'; // 扩展ODBC参数 FDConnection1.Params.Values['ODBCAdvanced'] := 'CharacterSet=UTF-8;ExtendedAnsiSQL=1'; // 建立连接 FDConnection1.Connected := true; fdQuery1.Open;
3. 额外检查项
- 确认Excel文件保存时使用了Unicode编码(如保存为xlsx格式,默认即为Unicode);
- 检查FDQuery的字段类型:确保字符型字段映射为
ftWideString或ftUnicodeString(Delphi 10.4中String默认是Unicode类型,字段映射需匹配); - 若仍有问题,可尝试在FDConnection的
Params中添加LocaleCode=0x0419(俄文区域)或对应格鲁吉亚文的区域代码,强制指定字符集区域。
内容的提问来源于stack exchange,提问作者basti
相关产品推荐
相关产品推荐

