【问题标题】:MS Access VBA - how to read utf8 text indepently from windows system localeMS Access VBA - 如何从 Windows 系统语言环境中独立读取 utf8 文本
【发布时间】:2019-03-29 03:28:40
【问题描述】:

我有一个带有文本字段的 MySQL 表。它包含一个超链接,并以 utf8 编码(utf8-unicode-ci collat​​ion)。我想从 VBA 以编程方式打开超链接。

文本字段可能包含诸如“őűö”之类的字符,这些字符在西欧代码页 (1252) 中不存在,但在中欧 (1250) 中可用。

我的第一次尝试是运行 pass-trough 查询,将字段值读入 VBA 字符串,然后使用 Application.Followhyperlink 打开它。当 Windows 系统区域设置(区域设置中非 unicode 兼容应用程序的默认代码页)为匈牙利语(使用代码页 1250)时,它可以工作,而当系统区域设置为德语(使用代码页 1252)时,它会失败。 VBA 字符串包含转换为系统语言环境指定的代码页的值。所以“C:\tükörtűrő”将被读作“C:\tukorturo”。

我不允许在 100 多台计算机上修复系统区域设置。那么,怎么做才对呢?


编辑:
经验教训:
* Debug.Print 不支持 unicode – 如 Erik von Asmuth 所述。调试窗口中显示的文本具有误导性。
* Application.FollowHyperlink 可以处理 unicode。
* 真正的问题是在打开链接之前进行链接健康检查,我使用了内置的 GetAttr(),这取决于系统区域设置。我已经用 GetFileAttributesW() 替换了它,现在一切似乎都正常了。一些功劳归功于 Bonnie West。 (https://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=74264&lngWId=1)

【问题讨论】:

    标签: ms-access unicode vba


    【解决方案1】:

    VBA 和 Access 在内部使用 UTF-16,而不是系统代码页,所以这根本不是问题。直通查询应该可以正常工作。然而:

    • 您需要使用 MySQL Unicode 驱动程序,而不是 MySQL ANSI 驱动程序

    • 并非所有 VBA 函数都支持 unicode 字符。例如, MsgBox 仅适用于 ANSI,并且会将不可用的字符转换为 问号或最接近的等效 ANSI 字符。

    • VBA 代码本身不是 unicode。您可以查看this answer 获取方法 将字符串设置为代码页中不可用的字符 由 VBA 使用。

    【讨论】:

    • 我正在使用 unicode 驱动程序。当我将查询结果读出为变体时,文本被转换。我应该将记录集字段值读入字节数组吗?
    • 你是怎么读出来的? Debug.Print 不支持 unicode
    • 我已经测试了各种链接文本,并且 Application.Followhyperlink 在系统区域设置为德语且链接不包含“őűöü”时有效。我的另一个方法是 debug.print。
    • 尝试打印到文本框,这也是 UTF-16。我不确定Application.FollowHyperlink 是否支持 UTF-16。我确实有代码依赖外部方法调用来创建支持 UTF-16 的消息框。
    • 谢谢。我明天去办公室试试。我有一个 mbox() 函数,它在带有是/否/取消按钮的表单上显示文本。
    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多