一、正則法(當文本相當長時,速度會很快)
function stringToByteArray($str,$charset,$to_charset) {
$str = iconv($charset,$to_charset,$str);
preg_match_all(‘/(.)/s’,$str,$bytes);
$bytes=array_map(‘ord’,$bytes[1]) ;
return $bytes;
}
function byteArrayToString($bytes,$charset,$to_charset) {
$bytes=array_map(‘chr’,$bytes);
$str=implode(”,$bytes);
$str = iconv($to_charset,$charset,$str);
return $str;
}
$byteArray=stringToByteArray(‘http測試’,’utf-8′,’gbk’);
print_r($byteArray);
$retStr=byteArrayToString($byteArray,’utf-8′,’gbk’);
echo $retStr;
一、迴圈法
/**
* 轉換一個String字串為byte數組
* @param $str 需要轉換的字串
* @param $bytes 目標byte數組
* @author Zikie
*/
function getBytes($string) {
$bytes = array();
for($i = 0; $i < strlen($string); $i++){
$bytes[] = ord($string[$i]);
}
return $bytes;
}
/**
* 將位元組數組轉化為String類型的資料
* @param $bytes 位元組數組
* @param $str 目標字串
* @return 一個String類型的資料
*/
function toStr($bytes) {
$str = '';
foreach($bytes as $ch) {
$str .= chr($ch);
}
return $str;
}
$byteArray=getBytes(iconv('utf-8','gbk','http測試'));
print_r($byteArray);
$retStr=toStr($byteArray);
echo $retStr;
兩種方法都是一樣的
結果為:Array
(
[0] => 104
[1] => 116
[2] => 116
[3] => 112
[4] => 178
[5] => 226
[6] => 202
[7] => 212
)
結果為:http測試
補充一個通用函數
要加密,則需要將字串轉為ASCII的位元組數組。反之,則要轉回來。代碼為什麼速度快?那就是,能不用FOR迴圈的,直接不用。使用PHP原有的函數,讓它實現,這是最快的
<?php
function stringToByteArray($str,$charset) {
$str = iconv($charset,'UTF-16',$str);
preg_match_all('/(.)/s',$str,$bytes); //註:本文的盜版已經有了。不過,提示一下讀者,這裡的正則改了。
$bytes=array_map('ord',$bytes[1]) ;
return $bytes;
}
function byteArrayToString($bytes,$charset) {
$bytes=array_map('chr',$bytes);
$str=implode('',$bytes);
$str = iconv('UTF-16',$charset,$str);
return $str;
}
$byteArray=stringToByteArray('13億人口大國,自認為精通PHP的還是相當多的!','utf-8');
print_r($byteArray);
$retStr=byteArrayToString($byteArray,'utf-8');
echo $retStr;
?>
每個函數只有4行代碼,沒有FOR迴圈,但當文本相當長時,你就能發現,差別真的很大