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;
}
};
答案
结果字符串未在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或字节码引起的)的主要内容,如果未能解决你的问题,请参考以下文章