【问题标题】:How to get UTF-8 string using COM object in PHP?如何在 PHP 中使用 COM 对象获取 UTF-8 字符串?
【发布时间】:2018-04-18 15:14:14
【问题描述】:

在我的 PHP 代码中,我从外部 DLL 实例化 COM 对象。它工作正常,除了我从 com 对象方法之一接收 JSON 字符串时遇到问题。

如果字符串没有任何非拉丁字符,我得到的 JSON 是正确的,但如果至少有一个非拉丁字符需要 UTF-8 编码,则从 COM 对象接收到的 JSON 在 PHP 中是不可解析的. json_last_error() 显示 UTF-8 编码有问题。

我很肯定 COM 对象返回正确编码的字符串,因为它在其他环境中使用并且工作正常。

当我检查收到的字符串内容时,很明显非拉丁字符被以奇怪和无效的方式“编码”。当我在 COM 对象中检查相同的字符串时,就在它被发送到 PHP 之前,它被正确编码。

似乎 PHP 到 COM 对象的通信是使用非 UTF-8 编码完成的,这会弄乱字符串。

我发现的唯一与将 UTF-8 与 COM 对象一起使用的事情是在 php.ini 的 [COM] 部分设置 com.code_page=UTF-8。但是,无论如何设置,我都有同样的不良行为。

我还应该怎么做才能从 COM 对象中获取正确编码的 UTF-8 字符串?

【问题讨论】:

    标签: php string encoding utf-8 com-object


    【解决方案1】:

    嗯,答案就在我眼前,我只是忽略了:

    COM::__construct (string $module_name [, mixed $server_name [, int $codepage [, string $typelib ]]])

    有codepage参数。如果设置为 CP_UTF8 就可以了。

    如果不使用服务器,$server_name 应该为 NULL。

    【讨论】:

    • 对于 COM,字符串很可能是使用 UTF-16 的 BSTR。但是,您已经找到了如何在桥接函数中对其进行转码。
    • Doc 说默认是 ANSI,但可能是 UTF-16 是其他的,因为我注意到文本编辑器可以正确显示该字符串,所以它知道如何处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2011-04-09
    • 2014-03-06
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多