PHP:使用iconv处理特殊字符

时间:2011-01-25 14:29:54

标签: php special-characters iconv

我仍然不明白iconv是如何运作的。

例如,

$string = "Löic & René";
$output = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string); 

我明白了,

  

注意:iconv()[function.iconv]:   检测到输入中的非法字符   字符串...

$string = "Löic";$string = "René";

我明白了,

注意:iconv() [function.iconv]:在输入字符串中检测到不完整的多字节字符。

我对$string = "&";

一无所知

我需要将两组不同的输出存储在数据库表的两个不同列中,

  1. 我需要将Löic & René转换为Loic & Rene以获得干净的网址。

  2. 我需要保持原样 - Löic & RenéLöic & René,然后只在我的html页面上显示时才用htmlentities($string, ENT_QUOTES);转换它们。

  3. 我尝试了下面php.net中的一些建议,但仍然无效,

    我有一种情况,我需要一些音译,但其他人忽略了(对于像ayn或hamza这样奇怪的变音符号)。添加// TRANSLIT // IGNORE似乎对我有用。它可以音译所有能够音译的内容,但随后会抛弃那些不可能的内容。

    所以:

    $string = "ʿABBĀSĀBĀD";
    
    echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $string);
    // output: [nothing, and you get a notice]
    
    echo iconv('UTF-8', 'ISO-8859-1//IGNORE', $string);
    // output: ABBSBD
    
    echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', $string);
    // output: ABBASABAD
    // Yay! That's what I wanted!
    

    和另一个,

    Andries Seutens 07-Nov-2009 07:38
    When doing transliteration, you have to make sure that your LC_COLLATE is properly set, otherwise the default POSIX will be used.
    
    To transform "rené" into "rene" we could use the following code snippet:
    setlocale(LC_CTYPE, 'nl_BE.utf8');
    
    $string = 'rené';
    $string = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
    
    echo $string; // outputs rene
    

    我怎样才能真正解决它们?

    感谢。

    修改

    这是我测试代码的源文件,

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" class="no-js">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <?php
    $string = "Löic & René";
    $output = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string); 
    ?>
    </html>
    

2 个答案:

答案 0 :(得分:21)

$clean = iconv('UTF-8', 'ASCII//TRANSLIT', utf8_encode($s));

答案 1 :(得分:14)

您是否以UTF-8编码保存了源文件?如果没有(我猜你没有,因为那将产生“不完整的多字节字符”错误),那么先试试。