【问题标题】:UTF-8 characters don't display correctlyUTF-8 字符无法正确显示
【发布时间】:2011-08-09 15:40:21
【问题描述】:

这是我的 PHP 代码:

<?php
$result = '';
$str = 'Тугайный соловей';
for ($y=0; $y < strlen($str); $y++) {
    $tmp = mb_substr($str, $y, 1);
    $result = $result . $tmp;
}
echo 'result = ' . $result;

输出是:

Тугайный Ñоловей

我能做什么?我必须将$result 放入 MySQL 数据库中。

【问题讨论】:

    标签: php utf-8 multibyte


    【解决方案1】:

    您的文件的编码是什么?它也应该是UTF8。您的 http 服务器的默认字符集是什么?它也应该是 UTF-8。

    编码仅在以下情况下有效:

    • 文件编码正确
    • 服务器告诉交付文件的编码是什么。

    使用数据库时,您还必须为数据库字段设置正确的编码 MySQL 客户端与服务器通信的方式(请参阅mysql_set_charset())。仅字段是不够的,因为您的 MySQL 客户端(在本例中为 PHP)可以默认设置为 ISO 并重新解释数据。所以你最终得到了 UTF8 DB -> ISO 客户端 -> 注入 UTF8 PHP 脚本。难怪最后搞砸了:-)

    如何使用正确的字符集提供文件?

    header('Content-type: text/html; charset=utf-8') 是一种解决方案

    包含AddDefaultCharset UTF-8的.htaccess文件是另一个

    HTML 元内容类型也可能有效,但最好使用 HTTP 标头发送此信息。

    PS:您还必须使用 mb_strlen(),因为 UTF8 字符串上的 strlen() 可能会报告超过实际长度。

    【讨论】:

    • 有两件事要检查,1) 你的 DB 是 UTf-8,2) 你的文档类型是 UTF-8 吗?
    • @Matthieu 是的,可悲...我想这是因为大多数人使用英语而不担心编码;-)
    • @Capsule:嗯?还是需要英文的编码!!
    • @tchrist 当然,但我说的是对 iso-8859-1 以外的其他编码,因为除非你想使用特定的标点符号或避免使用 html 实体,否则你可以坚持使用 iso-8859-1仅使用英文。事实上,你也可以在使用法语和其他一些语言时坚持使用它,因为常见的口音是 ISO 字符集的一部分。人们倾向于使用 UTF-8,因为它更通用并且避免(好吧,尽量避免)头痛,但大多数人不会测试整个设置是否是防弹的,因为在使用 UTF-8 特定字符之前你不会发现任何问题.
    • @Capsule:法语需要 UTF-8,或者至少需要 ISO 8859-15。否则你会错过 –, Œ, Ÿ。
    【解决方案2】:

    如果您要发送混合数据并且不想使用 php 标头指定 utf-8,您可以将此 html 添加到您的页面:

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    

    【讨论】:

      【解决方案3】:

      我想,您的代码是 windows-1251 编码,因为它是俄语 :) 将您的字符串转换为 utf-8:

      $str = iconv('windows-1251', 'utf-8', $str);
      

      【讨论】:

        【解决方案4】:

        如果你的数据库是UTF-8的,mysql也可以的。

        对于你的回声,如果你是在网站上做的,把它放在首页:

        header('Content-Type: text/html; charset=UTF-8');
        

        【讨论】:

          【解决方案5】:

          只需在开头添加这一行,在与服务器连接之后:

          mysqli_set_charset($conn,"utf8");
          

          【讨论】:

            【解决方案6】:

            如果您只是使用没有 HTML 标头等的 PHP 回显,这对我来说非常有用。

            $connect = mysqli_connect($host_name, $user_name, $password, $database);
            mysqli_set_charset($connect,"utf8");
            

            【讨论】:

              【解决方案7】:

              试试这个:

                  header('Content-Type: text/html; charset=UTF-8');
                  header("Content-type: application/octetstream");
                  header("Pragma: no-cache");
                  header("Expires: 0");
                  //print "$name_field\n$data";
              
                  // با این کد درست شد
                  print chr(255) . chr(254) . mb_convert_encoding("$name_field\n$data", 'UTF-16LE', 'UTF-8');
              

              【讨论】:

              • 您为什么在这里发送带有波斯语评论的答案?对任何人都没有用。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-04-12
              • 2018-04-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-05-15
              相关资源
              最近更新 更多