Access VBA中18号及以上按钮出现德语变音乱码问题
问题分析与解决
核心原因
从代码逻辑和现象来看,18号及以上按钮触发了不同的文件路径分支,导致读取的文件编码与1-17号不一致,进而引发德语变音字符乱码:
- 出现的
öäüß是典型的「UTF-8编码文本被当作ANSI编码读取」的错误结果。 - 查看
GetText函数中的路径判断逻辑:
只有当按钮的If Screen.ActiveControl.Parent.Name = "EmailVersand" And Screen.ActiveControl.Name Like "EmailButton*" Then strPfad = Forms!Startformular!txtVorlagenPfad & "TA_VBemails\" End IfName属性匹配EmailButton*格式时,才会使用TA_VBemails路径。如果18-20号按钮的命名不符合这个规则(比如叫TextButton18而非EmailButton18),就会走另一个路径分支,读取的文件可能是UTF-8编码,但代码默认按ANSI方式读取,最终导致乱码。
验证步骤
- 检查18-20号按钮的
Name属性,确认是否与1-17号一致(比如都是EmailButtonXX格式)。 - 对比两个路径下的文件编码:用记事本打开对应文件,点击「文件→另存为」,查看右下角的编码选项。1-17号对应的文件应为ANSI,18号及以上对应的则是UTF-8。
解决方案
方案1:统一按钮命名
将18-20号按钮的Name属性修改为EmailButton18、EmailButton19、EmailButton20,让它们触发相同的路径分支,读取编码一致的文件。
方案2:修改读取逻辑,兼容UTF-8编码
如果需要保留现有路径分支且支持UTF-8文件,修改GetText函数,改用ADODB.Stream读取文件以确保编码正确:
Public Function GetText(fName As String, Optional strPfad As String) As String Dim stream As Object Set stream = CreateObject("ADODB.Stream") On Error GoTo Err If strPfad = "" Then strPfad = Forms!Startformular!txtVorlagenPfad & GetPartFileName(CurrentDb.Name, bbGetName) If Screen.ActiveControl.Parent.Name = "EmailVersand" And Screen.ActiveControl.Name Like "EmailButton*" Then strPfad = Forms!Startformular!txtVorlagenPfad & "TA_VBemails\" End If End If If Right(strPfad, 1) <> "\" Then strPfad = strPfad & "\" With stream .Charset = "utf-8" .Open .LoadFromFile strPfad & fName GetText = .ReadText .Close End With Set stream = Nothing Exit Function Err: GetText = "" MsgBox Err.Description If Not stream Is Nothing Then stream.Close Set stream = Nothing End Function
该方法会强制以UTF-8编码读取文件,无论文件是否带BOM,都能正确解析德语变音字符。
内容的提问来源于stack exchange,提问作者bbProg
相关产品推荐
相关产品推荐

