0


在解释我遇到的问题之前,我将从我的用例开始。

我正在使用 phonegap 框架构建一个移动应用程序。
对于这个应用程序,我需要上传一个文件(用相机制作的图片)。
在大多数平台上,我可以将此图像作为 base64 编码图像取回。
我可以将其发送回服务器,它可以对其进行解码并保存。(并做一些其他有趣的事情,因为它是一个二维码)。

现在在 symbian 上,我无法取回 base64 字符串,只能获取图像的 URI。这不是问题,因为我可以使用 xmlhttprequest 来获取图像数据并使用 javascript 将其编码为 base64。

这种方法有效,但它给了我一个问题。
symbian 浏览器似乎有一个错误。它是 2005 年推出的基于 webkit 的浏览器(是的,它已经那么老了,即使在最新的 s60 手机上也是如此)。
错误在于它将所有它不知道的字符(不在 utf-8 表中)转换为 2 个字节。如果没记错的话,它是127以上的一切。

我曾尝试使用 javascript 修复此错误,但这是不行的(顺便说一句,不支持 canvas 和 getBinaries 或类似的东西,因为浏览器不支持 canvas 2d)。

所以,我尝试在 php 中构建一个解决方法来修复字节。这就是我现在所拥有的,尽管它不起作用:

function getValidBin($bin, $offset = 0) {
    $binLength = sizeof($bin);
    for ($i = $offset; $i<=$binLength; $i++) {
        if ($i == $binLength) {
            return false;
        }
        if ($bin[$i] < 127) {

            $binT = $bin[$i] + $bin[$i+1];
            $bin2 = $bin;
            $bin2[$i] = $binT;
            $bin2[$i+1] = null;
            if (imagecreatefromstring($bin2) != false) {
                return $bin2;
            } else {
                $bin3 = getValidBin($bin2, $i);

                if ($bin3 != false) {
                    return $bin3;
                }
            }
        }
    }
}

由于某种原因,此功能不起作用。我收到以下警告:

警告:imagecreatefromstring() [function.imagecreatefromstring]:第 98 行 /opt/content/erik/omnicol/HTML/WS/services/qrDecoder/QrDecoder.php 中的数据不是可识别的格式

我得到:

致命错误:达到“100”的最大函数嵌套级别,正在中止!在第 87 行的 /opt/content/erik/omnicol/HTML/WS/services/qrDecoder/QrDecoder.php

最后一个很容易解决,我想,但我想我还是会发布它。

现在,我的问题是:
我在正确的轨道上吗?
我该如何解决警告?

非常感谢,
埃里克

ps对不起,如果我的英语不好。我不是母语人士,因为我是荷兰人。
ps2 我所说的错误是这个: http: //markmail.org/message/iosbn3rbcgu5k6qt

编辑:最大 100 深度的解决方案比我想象的要难。所以这方面的帮助也会很棒。

4

2 回答 2

0

你为什么要在每个字节之后创建图像?那递归是为了什么?你不能只遍历字符串并修复那些双字节吗?像这样的东西:

function getValidBin($s) {
    $new_s = '';
    for ($i = 0; $i < strlen($bin) ; $i++)
    {
        $char = $s{$i};
        if (ord($char) > 127)
        {
            $char = chr(ord($char) + ord($s{$i}));
            $i++;
        }
        $new_s .= $char;
    }
}

您必须输入已经经过 base64 解码的字符串。

我以为你的线

$binT = $bin[$i] + $bin[$i+1];

应该是“如果有一个字符代码> 127,将这个和下一个字符代码加在一起并将其用作单个字符”,我认为这种方法确实是你想要的(我们不知道,因为我们不知道不知道你的数据)。

于 2010-12-01T11:16:47.757 回答
0

这个问题没有解决方案。
我切换到应用程序的 javascript 端来修复那里的字节。

于 2011-03-01T11:04:23.427 回答