如何从c++PHP模块返回utf-8字符串


How to return utf-8 string from c++ PHP module

我重写了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不会重新编码字符串。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,这是一个非常常见的错误。有些浏览器会让服务器覆盖。