2

我重写了 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。

PS 我可以将系统代码页更改为 windows-1251,但它不是其他语言的选项。

4

1 回答 1

0

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

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

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

您可以在浏览器窗口中检查 UTF-8 编码的字符串是否正确显示,只需简单地回显上面的示例,就echo 'и'好像您的编辑器支持 UTF-8 一样,或者echo "\xD0\xB8"不支持。

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

于 2013-08-08T08:50:19.153 回答