PHP4:Json_encode方法,接受多字节字符

时间:2014-11-12 18:29:55

标签: json encoding php4 multibyte

在我的公司,我们有一个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()方法。

1 个答案:

答案 0 :(得分:1)

一位同事发现了

mb_strlen($var, 'ASCII');

解决了这个问题。我们使用了一个较旧的lib版本,它使用了简单的mb_strlen。此修复程序似乎与您的mb_convert_encoding();

相同

问题现在解决了。非常感谢您的帮助!