在我的公司,我们有一个webservice zu将数据从非常古老的项目发送到相当新的项目。旧项目运行PHP4.4,它本身没有json_encode方法。所以我们改为使用PEAR类Service_JSON。 http://www.abeautifulsite.net/using-json-encode-and-json-decode-in-php4/
今天,我发现,这个类可以不处理多字节字符,因为它广泛使用ord()来从字符串中获取字符并替换字符。没有mb_ord()实现,即使在较新的PHP版本中也没有。它还使用$ string {$ index}来访问索引处的char,我不完全确定它是否支持多字节字符。
//Excerpt from encode() method
// STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
$ascii = '';
$strlen_var = $this->strlen8($var);
/*
* Iterate over every character in the string,
* escaping with a slash or encoding to UTF-8 where necessary
*/
for ($c = 0; $c < $strlen_var; ++$c) {
$ord_var_c = ord($var{$c});
//Here comes a switch which replaces chars according o their hex code and writes them to $ascii
我们致电
$Service_Json = new Service_JSON();
$data = $Service_Json->encode('Marktplatz, Hauptstraße, Endingen');
echo $data; //prints "Marktplatz, Hauptstra\u00dfe, Endinge". The n is missing
我们通过设置另一个接收序列化数组并返回json_encoded字符串的webservice来解决这个问题。这项服务在现代mahine上运行,因此它使用PHP5.4。但是这个“解决方案非常尴尬,我应该寻找一个更好的解决方案。有没有人有想法?”
问题描述
德语变音符号被正确替换。然后,字符串在末尾被剪切,因为ord返回错误的字符。 。 mb_strlen()不会改变任何东西,在这种情况下它给出与strlen相同的长度。
输入字符串是“ Marktplatz,Hauptstraße,Endingen ”,最后的n被切断了。 ß被正确编码为\ u00df。对于每个变音符号,它最后会减少一个字符串。
原因也可能是我们旧的数据库编码,但替换本身也能正常工作,所以我猜它是ord()方法。
答案 0 :(得分:1)
一位同事发现了
mb_strlen($var, 'ASCII');
解决了这个问题。我们使用了一个较旧的lib版本,它使用了简单的mb_strlen。此修复程序似乎与您的mb_convert_encoding();
相同问题现在解决了。非常感谢您的帮助!