php非拉丁到十六进制功能

时间:2011-10-13 18:43:33

标签: php encoding

我的网站是win-1251编码,它需要保持这种状态。但我还需要能够回显一些包含非拉丁语,非西里尔字符的链接,例如šžāņūī ......

我需要一个转换此

的函数
"māja un man tā patīk"

"māja un man tā patīk"

并且不会触及html,因此如果有<b>则需要保留为<b>,而不是&gt;&lt;

请不要对编码及其错误提出建议。

3 个答案:

答案 0 :(得分:0)

您可能不想编码的主要内容是&lt;,&gt;和&amp ;.那些真的是唯一的特殊角色。那么如何首先编码所有内容,然后解码&lt;,&gt;和&amp;我觉得你应该没事。

这是未经测试的:

$output = 
  htmlspecialchars_decode(
     htmlentities($input, ENT_NOQUOTES, 'CP-1251')
  );

让我知道

答案 1 :(得分:0)

Evert建议对我来说也是合乎逻辑的!如果你坚持这是一种方法,如果只有两个字母打扰你。对于更多的字母,scrit不会那么有效,需要改变。

<?PHP 
    function myConvert($str)
    {
        $chars['&#257;']='ā';
        $chars['&#299;']='ī';
                foreach ($chars as $key => $value)  
                    $output = str_replace($key, $value, $str); 
        echo $str;
    }
    myConvert("m&#257;ja un man t&#257; pat&#299;k");
?>

==================编辑==============

对于许多角色,也许这个可以帮到你:

<?PHP  
    function myConvert($str)
    {  
        $final=null;  
        $parts = preg_split("/&#[0-9]*;/i", $str);//get all text parts
        preg_match_all("/&#[0-9]*;/i", $str, $delimiters );//get delimiters;   
        $delimiters[0][]='';//make arrays equal size  
        foreach($parts as $key => $value)
            $final.=$value.mb_convert_encoding
            ($delimiters[0][$key], "UTF-8", "HTML-ENTITIES");
        return $final; 
    }  
$fh = fopen("testFile.txt", 'w') ; 
fwrite($fh, myConvert("m&#257;ja un man t&#257; pat&#299;k&#299;")); 
fclose($fh); 
?>

所需的输出写入文本文件中。这个代码完全如同 - 在某个项目中没有合并 - 做它声称要做的事情。将&#257;之类的代码转换为它们出现的类似字符。

答案 2 :(得分:0)

$str = "<b>Obāchan</b> おばあちゃん";

$str = preg_replace_callback('/./u', function ($matches) {
    $chr = $matches[0];
    if (strlen($chr) > 1) {
        $chr = mb_convert_encoding($chr, 'HTML-ENTITIES', 'UTF-8');
    }
    return $chr;
}, $str);

这要求原始$str为UTF-8编码,即您的PHP文件应以UTF-8保存。它将所有非ASCII兼容代码点编码为HTML实体。由于所有HTML特殊字符都是ASCII字符,因此它们保持不变。结果字符串是纯ASCII。由于较低的Win-1251代码点与ASCII兼容,因此生成的字符串也是有效的Win-1251字符串。上述$str转换为:

<b>Ob&#257;chan</b> &#12362;&#12400;&#12354;&#12385;&#12419;&#12435;