php函数返回意外 (可能是unicode或字节码引起的)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php函数返回意外 (可能是unicode或字节码引起的)相关的知识,希望对你有一定的参考价值。

简单的凯撒密码加密功能

现在,加密字符串“g”将导致“ ”。同时加密“g”返回预期的“G”。为什么可能是 符号的原因?如果输入字符串是“g”,则预期结果是:“G”。

代码片段:

function encrypt($plaintext, $n, $key1, $key2, $L1, $L2) {
    $result = '';
        // encrypt first half of input
    $array_key1 = preg_split('//u', $key1, -1, PREG_SPLIT_NO_EMPTY);
    for ($k=0; $k < (int)(mb_strlen($plaintext)/2); $k++) {
        $char = $plaintext[$k];
        if (in_array($char, $array_key1)) {
            $i = (strpos($key1, $char) + $n) % $L1;
            $result .= $key1[$i];
        } else {
           $result .= $char;
        }
    };

full code

答案

结果字符串未在utf-8中正确编码,可能是php配置中的默认编码。

预期结果显示

echo utf8_encode((string)$string . "
");

而不是echo $string . " ";

假设Â是加密的预期结果。

另一答案

我已经采取了一些自由来改进/简化你的功能(希望你不介意)。

一些说明:

  • 只传递所需的数据作为函数参数 - 让函数进行长度计数和相关处理
  • 通过将$key1$key2打包成一个阵列,您的过程可以更加干燥。
  • 通过在必要的地方实施mb_函数调用,我相信这是按预期工作的。

代码:(Demo

function encrypt($plaintext, $n, $keys, $encoding='UTF-8'){

    $plain_chars = preg_split('//u', $plaintext, -1, PREG_SPLIT_NO_EMPTY);
    $plain_halves = array_chunk($plain_chars, ceil(sizeof($plain_chars)/2));

    $result='';

    foreach($plain_halves as $i=>$chars){
        $L=mb_strlen($keys[$i]);
        foreach($chars as $char){
            echo "i = $i, char = $char, ";
            if(($offset = mb_strpos($keys[$i],$char,0,$encoding))!==false){
                echo "offset $offset & calc: ($offset+$n)%$L = ",($offset+$n)%$L," 
";
                $result .= mb_substr($keys[$i],($offset+$n)%$L,1,$encoding);
            }else{
                echo "no viable offset
";
                $result .= $char;
            }
        }
    }
    echo "Output is: ";
    return $result;
}

$keys=[
    'aA0!bBcC"1dDeE2f#Fg¤G3%hHi&I4/jJ(kK)5l=Lm?M6@nNoO7pPqQ8rRsS9tTuUvVwWxXyYzZ',
    '1aAbBc2CdDeE3fFgG4hHjJ5kKlLm6iIwWMnNo7OpPq8QrRsS9tTuUvVxXyYzZ'
];

$string = 'g ';

var_export(encrypt($string, 1, $keys));

输出:

i = 0, char = g, offset 18 & calc: (18+1)%74 = 19 
i = 1, char =  , no viable offset
Output is: '¤ '

附:这是一个无正则表达式的替代方案:

function encrypt($plaintext, $n, $keys, $encoding='UTF-8'){
    $length=mb_strlen($plaintext);
    $key_lengths=[mb_strlen($keys[0]),mb_strlen($keys[1])];
    $midpoint=floor($length/2);
    $result='';
    for($x=0; $x<$length; ++$x){
        $i = $x<$midpoint?0:1;
        $char=mb_substr($plaintext,$x,1,$encoding);
        $result .= (($offset=mb_strpos($keys[$i],$char,0,$encoding))!==false)?mb_substr($keys[$i],($offset+$n)%$key_lengths[$i],1,$encoding):$char;
    }
    return $result;
}

以上是关于php函数返回意外 (可能是unicode或字节码引起的)的主要内容,如果未能解决你的问题,请参考以下文章

js怎样获取字符ASCII码?

PHP将字符串编译为字节码而不对其进行评估

什么是Unicode码?它由几个字节组成

Java的字符类型采用的是Unicode编码方案,每个Unicode码占用几个比特位

unicode 是几个字节?

ascii码与unicode码的区别