2008-12-17 62 views
38

我的一些脚本使用不同的编码,当我尝试将它们合并时,这就成了一个问题。将utf8字符转换为iso-88591并以PHP退回

但我不能改变他们所使用的编码,而不是我想要改变从脚本一个结果的encodig,并在脚本B.

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

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

+1

utf8_decode应该是你的utf2iso?!? – BlaM 2008-12-17 13:05:45

+0

值得注意的是,PHP继续在内部转移到utf-8,所以任何你可能从外面输入的字符串。设置cURL,文件访问函数,流,PDO/MySQL或任何其他用于访问外部数据的API以使用UTF-8,以便在PHP获取它时已经正确。 – Xeoncross 2015-10-22 19:36:54

回答

100

看看iconv()mb_convert_encoding()。 只是顺便说一句:为什么不utf8_encode()utf8_decode()为你工作?

utf8_decode - 与 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。

+0

感谢您的回答,您和其他人都是对的:utf8_decode()似乎可以完成工作。一定有一些问题与文件或我的浏览器。至少我不再能够重现错误......(也许我在浏览器 - 字符集设置上做了错误处理?) – qualbeen 2008-12-17 19:01:14

+0

只是为了记录:我遇到过这样的情况,但我注意到了iconv已被调用两次(嵌套)到相同的str变量。在我删除第一个电话后,就像一个魅力。 (utf8_decode和mb_convert_enconding没有被使用) – colares 2012-06-08 21:31:03

0

您需要使用iconv包,特别是其iconv功能。

5

首先,不要使用不同的编码。它导致一团糟,而UTF-8绝对是你应该到处使用的一个。

很可能您的输入不是ISO-8859-1,而是别的东西(ISO-8859-15,Windows-1252)。要从这些转换,请使用iconvmb_convert_encoding

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

0

我用:

function utf8_to_html ($data) { 
    return preg_replace(
     array (
      '/ä/', 
      '/ö/', 
      '/ü/', 
      '/é/', 
      '/à/', 
      '/è/' 
     ), 
     array (
      'ä', 
      'ö', 
      'ü', 
      'é', 
      'à', 
      'è' 
     ), 
     $data 
    ); 
} 
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

-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');  
    } 
} 
1

设置在头meta标记为

<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); 

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

0

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

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

最好就是使用

$值= mb_convert_encode($值,“HTML实体” , 'UTF-8');

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

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