【问题标题】:Convert utf8-characters to iso-88591 and back in PHP将 utf8 字符转换为 iso-88591 并返回 PHP
【发布时间】:2010-09-27 07:52:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • utf8_decode 应该是你的 utf2iso 吗?!?
  • 值得注意的是,PHP 继续在内部迁移到 utf-8,因此您拥有的任何字符串都可能来自外部。将 cURL、文件访问函数、流、PDO/MySQL 或任何其他用于访问外部数据的 API 设置为使用 UTF-8,以便 PHP 获取它时它已经正确。

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


【解决方案1】:

使用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

【讨论】:

    【解决方案2】:

    用起来会好很多

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

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

    【讨论】:

    • 对于使用此解决方案的其他任何人,请注意该功能实际上是 mb_convert_encoding
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      尽管如此,utf8_encodeutf8_decode 应该适用于 ISO-8859-1。如果您可以发布一个文件或uuencodedbase64 示例字符串的链接,因为它的转换失败或产生意外结果。

      【讨论】:

      • iconv,还是 mb_convert_encoding? iconv 需要知道输入编码,但情况可能并非如此。
      • @Benubird 如果您猜测编码,您可能会遇到更严重的问题(现在它不容易重现,因为它可能取决于字符的频率)。但你是对的,mb_convert_encoding 绝对属于这个答案。已添加。
      • “避免使用除 UTF8 以外的任何编码”一般来说是个好建议,但有时这是不可能的。例如,我们正在尝试让第 3 方集成在第三方需要拉丁 1 格式的 XML 的情况下工作。
      【解决方案5】:

      我用过:

      function utf8_to_html ($data) {
          return preg_replace(
              array (
                  '/ä/',
                  '/ö/',
                  '/ü/',
                  '/é/',
                  '/à/',
                  '/è/'
              ),
              array (
                  'ä',
                  'ö',
                  'ü',
                  'é',
                  'à',
                  'è'
              ),
              $data 
          );
      }
      

      【讨论】:

        【解决方案6】:

        我使用这个功能:

        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】:

          将 head 中的元标记设置为

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

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

          【讨论】:

            【解决方案8】:
            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');       
                 }
            }
            

            【讨论】:

            • 请尝试在代码中添加一些解释,以增强帖子的教育价值。
            【解决方案9】:

            看看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。

            【讨论】:

            • 感谢您的好回答,您和这里的其他人是对的:utf8_decode() 似乎完成了工作。文件或我的浏览器一定有问题。至少我不再能够重现错误......(也许我的浏览器字符集设置有问题?)
            • 只是为了记录:我遇到过这样的情况,但我注意到 iconv 已被调用两次(嵌套)到同一个 str var。在我删除第一个电话后,它就像一个魅力。 (utf8_decode 和 mb_convert_enconding 没用过)
            • 这个建议帮助我解决了一个特殊的问题,即 UTF-8 字符串(“Atlántico”)首先被逐字编码为 ISO-8859-1(看起来像“Atlántico”),然后这些单字节字符被重新编码回 UTF-8(看起来完全一样的“Atlántico”,但这次每个字符都是 UTF-8 编码的)。 utf8_decode() 有帮助,因为它将 UTF-8 字符解码为其文字 ANSI 替代品,然后以某种方式神秘地正确读取并显示为 UTF-8 字符。这有意义吗?嗯..
            【解决方案10】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-10-11
              • 1970-01-01
              • 2013-08-18
              • 1970-01-01
              • 2011-08-26
              • 2012-12-04
              • 1970-01-01
              相关资源
              最近更新 更多