PHP4:Json_编码方法,接受多字节字符

PHP4:Json_编码方法,接受多字节字符,json,encoding,php4,multibyte,Json,Encoding,Php4,Multibyte,在我的公司里,我们有一个Web服务,可以将非常旧的项目中的数据发送到非常新的项目中。旧项目运行PHP4.4,它本机没有json_编码方法。因此,我们改用PEAR类服务_JSON 今天,我发现,这个类可以而不是处理多字节字符,因为它广泛用于从字符串中获取字符码并替换字符。没有mb_ord()实现,即使在较新的PHP版本中也没有。它还使用$string{$index}访问索引中的字符,我不完全确定它是否支持多字节字符 //Excerpt from encode() method // STRING

在我的公司里,我们有一个Web服务,可以将非常旧的项目中的数据发送到非常新的项目中。旧项目运行PHP4.4,它本机没有json_编码方法。因此,我们改用PEAR类服务_JSON

今天,我发现,这个类可以而不是处理多字节字符,因为它广泛用于从字符串中获取字符码并替换字符。没有mb_ord()实现,即使在较新的PHP版本中也没有。它还使用$string{$index}访问索引中的字符,我不完全确定它是否支持多字节字符

//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
我们通过设置另一个Web服务来解决这个问题,它接收序列化数组并返回json_编码的字符串。此服务在现代mahine上运行,因此它使用PHP5.4。但这个“解决方案”相当尴尬,我应该找一个更好的。有人有想法吗

问题描述

正确地替换了德语umlauts。但是,由于ord返回了错误的字符,因此字符串在末尾被截断。mb_strlen()不会改变任何内容,在本例中,它给出的长度与strlen相同

输入字符串为“Marktplatz,Hauptstraße,Endingen”,结尾的n被截断。ß被正确编码为\u00df。对于每一个Umlaut,它在结尾多剪切一个字符


原因也可能是我们的旧数据库编码,但替换本身工作正常,所以我猜是ord()方法。

一位同事发现了这一点

mb_strlen($var, 'ASCII');
解决了这个问题。我们使用了一个旧的lib版本,它使用了简单的mb_strlen。此修复程序似乎与您的mb_convert_编码()相同


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

我刚刚下载了
服务\u JSON
模块,并用您的输入数据对其进行了测试。工作非常好。我得到了相同的编码
\u00df
,但我没有错过最后的
n
。如果您使用
strlen(\u input\u string)会得到什么
?它返回33的长度。如果正确,我们的数据库编码是错误的。mb_check_encoding()返回false,mb_detect_encoding()返回false返回utf-8。如果长度为33,则意味着
ß
是作为
0xDF
的单字节字符输入的,而不是
0xC39F
的utf-8表示形式。我想知道这是否可能是问题所在?问题出现在每个umlaut上,äüö和ßPHP>5.2中的jsonß编码和encode之间一定存在差异在服务中_JSON,因为在JSON中_encode()它是有效的。你知道我如何检测正确的编码吗?我的检测编码不起作用-它返回UTF-8,但数据库似乎使用了另一种编码。我猜UTF-8是脚本文件编码?PhpMyAdmin也显示损坏的UMLAUT,但当我在浏览器中输出字符串时,一切都很好。目前,我建议使用手动通过十六进制转储进行检查。最简单的方法是
unpack('H*',$yourstr)
。如果您将
ß
视为
0xC39F
,那么数据库将为您提供适当的UTF-8(以我对库的有限经验而言)应该使用JSON服务。如果它为您提供了单字节表示的
0xDF
,那么我建议首先通过
mb\u convert\u编码($yourstr,'UTF-8','ASCII')
传递它。如果失败,我们可以把它带到StackOverflow聊天室,希望能解决一些问题。
mb_strlen($var, 'ASCII');