PHP 扩展中的字符编码
charachter encoding in PHP Extension
我目前正在使用 Zend API 在 C++ 中编写 PHP 扩展。基本上,我围绕我的原生 C++ 接口方法制作 PHP_METHOD{..} 包装器,并使用 "zend_parse_parameters(..)" 获取相应的输入参数。
此扩展包含可以将字符串作为参数的方法,例如文件名。
我从 http://php.net/manual/en/language.types.string.php#language.types.string.details 得知字符串在 PHP 中没有编码,但我仍然可以期望 PHP 程序员会使用像 "utf8_decode(..)" 这样的函数这样扩展程序就可以正确读取输入字符串了吗?
或者 PHP 程序员是否期望扩展检测来自 php 脚本的编码并相应地处理字符串?
非常感谢您的帮助!谢谢!
你是对的。字符串只是 PHP 中的二进制 blob。作为扩展的作者。您的选择:
- 让用户将您的扩展名交给 UTF-8:目前为止最好的选择。用户必须做出决定。断言该字符串是 UTF-8 可编码的并且提前失败。
- 自己编码:你无法知道字符串的含义。由于 PHP 字符串只是二进制 blob 并且没有编码信息,因此您不知道预期的字符串内容是什么。它也可能来自一个具有奇怪编码的 Windows 文件,并与一个完全不同的编码连接在一起。更糟糕的是,它可能是 UTF-8 编码的,但实际上不是 UTF-8,在用户不知情的情况下,您以这种方式错误地解释了它。因此,解决方案 1,让用户通过 UTF-8。
- 备选方案:强制用户传递输入编码。
下面是备选方案 3 的示例:
$obj = MyExtensionClass('UTF-8'); // force encoding
$obj->someMethod($inputStr); // try to convert now
标准库使用方法 1。将 json_encode
视为 example:
我目前正在使用 Zend API 在 C++ 中编写 PHP 扩展。基本上,我围绕我的原生 C++ 接口方法制作 PHP_METHOD{..} 包装器,并使用 "zend_parse_parameters(..)" 获取相应的输入参数。
此扩展包含可以将字符串作为参数的方法,例如文件名。
我从 http://php.net/manual/en/language.types.string.php#language.types.string.details 得知字符串在 PHP 中没有编码,但我仍然可以期望 PHP 程序员会使用像 "utf8_decode(..)" 这样的函数这样扩展程序就可以正确读取输入字符串了吗?
或者 PHP 程序员是否期望扩展检测来自 php 脚本的编码并相应地处理字符串?
非常感谢您的帮助!谢谢!
你是对的。字符串只是 PHP 中的二进制 blob。作为扩展的作者。您的选择:
- 让用户将您的扩展名交给 UTF-8:目前为止最好的选择。用户必须做出决定。断言该字符串是 UTF-8 可编码的并且提前失败。
- 自己编码:你无法知道字符串的含义。由于 PHP 字符串只是二进制 blob 并且没有编码信息,因此您不知道预期的字符串内容是什么。它也可能来自一个具有奇怪编码的 Windows 文件,并与一个完全不同的编码连接在一起。更糟糕的是,它可能是 UTF-8 编码的,但实际上不是 UTF-8,在用户不知情的情况下,您以这种方式错误地解释了它。因此,解决方案 1,让用户通过 UTF-8。
- 备选方案:强制用户传递输入编码。
下面是备选方案 3 的示例:
$obj = MyExtensionClass('UTF-8'); // force encoding
$obj->someMethod($inputStr); // try to convert now
标准库使用方法 1。将 json_encode
视为 example: