字符替换编码php

时间:2014-01-14 17:34:22

标签: php html regex wordpress utf-8

我有一个字符串,我想将所有'a'字符替换为希腊字母'α'。我不想转换字符串中的html元素,即<a href="http://a-url-with-a-characters">text</a>

功能:

function grstrletter($string){

    $skip = false;
    $str_length = strlen($string);

    for ($i=0; $i < $str_length; $i++){

        if($string[$i] == '<'){
            $skip = true;
        }

        if($string[$i] == '>'){
            $skip = false;
        }

        if ($string[$i]=='a' && !$skip){
            $string[$i] = 'α';
        }
    }

    return $string;

}

我所做的另一项功能完美无缺,但它没有考虑到hmtl元素。

function grstrletter_no_html($string){

 return strtr($string, array('a' => 'α'));

}

我也尝试了很多php提供的编码功能而没有运气。

当我回复希腊字母时,浏览器输出它没有问题。当我返回字符串时,浏览器会在发生替换时在三角形内输出经典的奇怪问号。

我的标题有<meta http-equiv="content-type" content="text/html; charset=UTF-8">,我也尝试使用php header('Content-Type: text/html; charset=utf-8');,但又没有运气。

该字符串来自UTF-8中的数据库,该站点位于wordpress中,所以我只使用wordpress函数来获取我想要的内容。我不认为是db问题,因为当我使用我的函数grstrletter_no_html()时,一切正常。

当我逐个字符地迭代字符串时,问题似乎发生了。

文件保存为UTF-8,没有BOM(记事本++)。我也试图改变文件的编码而没有再好运。

我还尝试用相应的html实体&#945;&alpha;替换希腊字母,但同样的结果也是如此。

我还没有尝试任何正则表达式。

我希望得到任何帮助和提前感谢。

尝试:Greek characters encoding works in HTML but not in PHP

修改

基于 deceze 精彩回答的解决方案:

function grstrletter($string){

    $skip = false;
    $str_length = strlen($string);

    for ($i=0; $i < $str_length; $i++){

        if($string[$i] == '<'){
            $skip = true;
        }

        if($string[$i] == '>'){
            $skip = false;
        }

        if ($string[$i]=='a' && !$skip){
            $part1 = substr($string, 0, $i);
            $part1 = $part1 . 'α';
            $string = $part1 . substr($string, $i+1);
        }
    }

    return $string;

}

1 个答案:

答案 0 :(得分:2)

问题是你只设置字符串的一个字节。例如:

$str = "\x00\x00\x00";

var_dump(bin2hex($str));

$str[1] = "\xff\xff";

var_dump(bin2hex($str));

输出:

string(6) "000000"
string(6) "00ff00"

您正在设置一个双字节字符,但实际上只有一个字节被压​​入字符串。这里的第二个结果必须是00ffff才能使代码正常工作。

您需要的是将字符串从0剪切到$i - 1,将'α'连接到其中,然后将字符串$i + 1的其余部分连接到它上面如果要插入多字节字符。那,或使用mbstring函数使用字符而不是字节

有关更多背景信息,请参阅What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text