使用xmlrpc_encode_request时接收器端的编码问题

时间:2014-08-21 09:56:52

标签: php character-encoding utf8-decode

我遇到了charsets的问题以及它们如何在我发送的请求中编码。我有一个测试用例,我希望代码最终得到两侧完全相同的md5-hash。显然,虽然仍然是角色'å'。 (所以没有转换成一些破碎的字符或只是'?')

源输入是utf8并包含挪威字符,例如“båt”。

然后,此输入将发送到希望数据为latin1 / ISO-8859-1的API。

一个目标也是避免将utf8_decode添加到接收端。

所以这是我迄今为止发送的非常简化的代码:

$password_send = 'båt';
echo "Test 1: " . md5( $password ) . "\n";
$params = array('password' => $password);
$request = xmlrpc_encode_request($module, $params);

这就是接收端对待它的方式。它基本上只是将其转换为md5哈希并将其发送到另一个方法。没有对传入数据进行其他转换。

$_hash = md5( $password_receive );
echo "Test 2: {$_hash}\n";
Member::updatePassword($member_id, $_hash);

我需要$ _hash(当'båt'被发送时)最终作为哈希7e2cdd98fccee62723784a815a2ecdcb。因为当密码'båt'保存在站点本身(而不是通过API)时,这是'båt'解析的md5-hash

因此,当我在API请求中发送'båt',然后在接收端,它最终得到:fd9cac747daca144726dc579c32f48a,这是错误的。当我在发送之前检查'båt'的md5()时,它也会显示为fd9cac747daca144726dc579c32f48ae。

我想这是预料之中的,因为我还没有使用utf8_decode,但是如果我改变我发送的内容,就像这样:$ password_send = utf8_decode('båt');

然后它仍然没有在接收器端以正确的哈希结束,然后最终得到:b865deb1e3b0891a41c5444c00893a0f

但是,如果我也在接收端添加utf8_decode,如下所示:$ _hash = utf8_decode($ password_receive),那么它最终会得到我需要的哈希值:7e2cdd98fccee62723784a815a2ecdcb

但这似乎非常错误......必须双方都做utf8_decode。虽然此接收端的哈希现在也是正确的,但问题是我不想更改接收端的任何代码。并且在发送值之前只执行两次utf8_decode是行不通的,因为那样我最终会在接收端使用哈希值c2d1fbc45e123f65edd74401ef58dd6a(这相当于执行md5('b?t')。它只能工作当我发送它之前执行utf8_decode一次,然后在接收端执行一次。

所以我开始意识到xmlrpc_encode_request可能是罪魁祸首,因为它可能会对它进行一些转换。首先,在$ password_send值未被utf8_decoded的情况下,我检查了$ request的var_dump所说的内容。那就是:

<string>b&#195;&#165;t</string>

当我在将值$ password_send设置为xmlrpc请求之前对其执行utf8_decode时,它是:

<string>b&#229;t</string>

然后我阅读了关于xmlrpc_encode_request的文档。我尝试过各种output_options组合,但它们似乎都没有用。在每种情况下,我仍然必须在接收器端的输入数据的代码中执行utf8_decode,最终得到我需要的完全相同的md5。

我意识到这可能有点令人困惑。如果有人能够帮助我,我真的很感激。通过给我一些指针,我应该做什么或尝试。因为我现在已经完全迷失在这个问题上:(

1 个答案:

答案 0 :(得分:0)

问题似乎是xmlrpc_encode_request函数的转义。我有同样的问题,虽然有捷克语“ě”字符。我相信它可能是PHP中的错误,但我发现了一个简单的解决方法。

转出非打印和非ascii字符。

echo xmlrpc_encode_request('test', 'å'); //&#195;&#165; - incorrect
echo xmlrpc_encode_request('test', 'å', ['escaping' => 'markup']); //å - correct