【问题标题】:How to return utf-8 string from c++ PHP module如何从 C++ PHP 模块返回 utf-8 字符串
【发布时间】:2013-06-25 18:06:44
【问题描述】:

我重写 PHP LDAP 模块并从 PHP 的源代码 MSVC 9 构建它。我这里有 utf-8 编码的字符串。

char *buffer;

然后我打电话

zval *tmp2;
MAKE_STD_ZVAL(tmp2);
array_init(tmp2);
......
add_index_stringl(tmp2, i, buffer, strlen(buffer), 1)

哇!

在 PHP 脚本中,我得到 windows-1252 编码的字符串! windows-1252 是我的本地代码页。在这种情况下,我丢失了俄罗斯符号,我得到“???”而不是它。

如何强制 php 不根据本地设置重新编码我的数据?我的脚本中需要 utf-8。

附:我可以将系统代码页更改为 windows-1251,但它不适用于其他语言。

【问题讨论】:

    标签: php encoding utf-8 localization


    【解决方案1】:

    PHP 不会重新编码字符串。 PHP 将您提供的任何字符串视为简单的字节序列。如果您要求,它只会更改实际字节。

    你说你看到“???”代替俄语字符,这表明 - 如果它们真的是 UTF-8 编码开始 - 你只是在浏览器窗口中错误地显示它们。

    我建议您检查实际的字节序列以查看您的字符串是否是您输入的内容。例如,如果您的字符串是“и”,请尝试使用urlencode 将其打印出来,您应该会看到“%D0%B8”这是两个 utf8 编码的字节。如果您只看到一个字节,那么我认为问题出在您的扩展程序上。

    您可以在浏览器窗口中检查 UTF-8 编码的字符串是否正确显示,只需简单地回显上面的示例即可,如果您的编辑器支持 UTF-8,则为 echo 'и',如果不支持,则为 echo "\xD0\xB8" .

    如果您仍然看到“???”然后确保在标记(元标记)中将页面的编码设置为 UTF-8,并确保服务器在 Content-Type 标头中不反对它,它应该是 text/html; charset=utf-8。让 HTML 文档说编码是 UTF-8,但服务器说它是 windows-1252 是一个非常常见的错误。一些浏览器会让服务器覆盖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 2014-03-06
      • 2016-05-31
      • 2023-03-27
      • 1970-01-01
      • 2016-07-13
      • 2017-09-16
      相关资源
      最近更新 更多