将utf8-characters转换为iso-88591并返回PHP

时间:2008-12-17 12:40:50

标签: php encoding utf-8 iso-8859-1

我的一些脚本使用不同的编码,当我尝试将它们组合起来时,这就成了一个问题。

但我无法更改他们使用的编码,而是想要更改脚本A中结果的编码,并将其用作脚本B中的参数。

那么:有没有简单的方法可以在PHP中将字符串从UTF-8更改为ISO-88591?我看过utf_encode和_decode,但是他们没有做我想要的。为什么不存在任何“utf2iso()” - 函数或类似函数?

我认为我的字符不能用ISO格式编写,所以这不应该是个大问题。

10 个答案:

答案 0 :(得分:113)

查看iconv()mb_convert_encoding()。 顺便说一下:为什么utf8_encode()utf8_decode()不适合你?

  

utf8_decode - 使用转换字符串   用ISO编码的ISO-8859-1字符   UTF-8到单字节ISO-8859-1

     

utf8_encode - 对ISO-8859-1进行编码   字符串为UTF-8

基本上

$utf8 = 'ÄÖÜ'; // file must be UTF-8 encoded
$iso88591_1 = utf8_decode($utf8);
$iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $utf8);
$iso88591_2 = mb_convert_encoding($utf8, 'ISO-8859-1', 'UTF-8');

$iso88591 = 'ÄÖÜ'; // file must be ISO-8859-1 encoded
$utf8_1 = utf8_encode($iso88591);
$utf8_2 = iconv('ISO-8859-1', 'UTF-8', $iso88591);
$utf8_2 = mb_convert_encoding($iso88591, 'UTF-8', 'ISO-8859-1');

所有人都应该这样做 - utf8_en/decode()不需要特殊扩展,mb_convert_encoding()需要ext / mbstring,iconv()需要ext / iconv。

答案 1 :(得分:6)

首先,不要使用不同的编码。它会导致混乱,UTF-8绝对是你应该在任何地方使用的。

您的输入可能不是ISO-8859-1,而是其他内容(ISO-8859-15,Windows-1252)。要从中转换,请使用iconvmb_convert_encoding

尽管如此,utf8_encodeutf8_decode应该适用于ISO-8859-1。如果您可以发布指向转换失败或产生意外结果的文件或uuencodedbase64示例字符串的链接,那就太好了。

答案 2 :(得分:1)

将元标记设置为

 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 

使用链接http://www.i18nqa.com/debug/utf8-debug.html替换所需的符号字符。

然后使用str_replace,如

    $find = array('“', '’', '…', '—', '–', '‘', 'é', 'Â', '•', 'Ëœ', 'â€'); // en dash
                        $replace = array('“', '’', '…', '—', '–', '‘', 'é', '', '•', '˜', '”');
$content = str_replace($find, $replace, $content);

它使用的方法和帮助很多。谢谢!

答案 3 :(得分:1)

使用

要好得多

$ value = mb_convert_encode($ value,'HTML-ENTITIES','UTF-8');

特别是当您使用AJAX调用提交“ISO-8859-1”字符时。它适用于中文,日文,捷克文,德文和更多语言。

答案 4 :(得分:0)

您需要使用iconv包,特别是其iconv函数。

答案 5 :(得分:0)

我用过:

function utf8_to_html ($data) {
    return preg_replace(
        array (
            '/ä/',
            '/ö/',
            '/ü/',
            '/é/',
            '/à/',
            '/è/'
        ),
        array (
            '&auml;',
            '&ouml;',
            '&uuml;',
            '&eacute;',
            '&agrave;',
            '&egrave;'
        ),
        $data 
    );
}

答案 6 :(得分:0)

我使用这个功能:

function formatcell($data, $num, $fill=" ") {
    $data = trim($data);
    $data=str_replace(chr(13),' ',$data);
    $data=str_replace(chr(10),' ',$data);
    // translate UTF8 to English characters
    $data = iconv('UTF-8', 'ASCII//TRANSLIT', $data);
    $data = preg_replace("/[\'\"\^\~\`]/i", '', $data);


    // fill it up with spaces
    for ($i = strlen($data); $i < $num; $i++) {
        $data .= $fill;
    }
    // limit string to num characters
   $data = substr($data, 0, $num);

    return $data;
}


echo formatcell("YES UTF8 String Zürich", 25, 'x'); //YES UTF8 String Zürichxxx
echo formatcell("NON UTF8 String Zurich", 25, 'x'); //NON UTF8 String Zurichxxx

在我的博客中查看我的功能 http://www.unexpectedit.com/php/php-handling-non-english-characters-utf8

答案 7 :(得分:0)

在我的情况下,在上传了包含这些字符的名称的文件后,使用Filezilla甚至看不到它们!在Cpanel filemanager中,他们被展示了? (在黑色背景下)。 这个组合使它在浏览器上正确显示(HTML文档是西方编码的):

$dspFileName = utf8_decode(htmlspecialchars(iconv(mb_internal_encoding(), 'utf-8', basename($thisFile['path']))) );

答案 8 :(得分:0)

使用html_entity_decode()htmlentities()

$html = html_entity_decode(htmlentities($html, ENT_QUOTES, 'UTF-8'), ENT_QUOTES , 'ISO-8859-1');

htmlentities()将您的输入格式化为UTF8html_entity_decode()将其格式化为ISO-8859-1

答案 9 :(得分:-1)

function parseUtf8ToIso88591(&$string){
     if(!is_null($string)){
            $iso88591_1 = utf8_decode($string);
            $iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $string);
            $string = mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8');       
     }
}