【问题标题】:PHP problem character setPHP问题字符集
【发布时间】:2011-04-20 17:39:35
【问题描述】:

我遇到了用户上传压缩文本文件的问题。提取文本内容后,我将它们导入 mysql 数据库。但是后来当我在浏览器中显示文本时,一些字符会出现乱码。我尝试对它们进行编码,但无法使用 PHP 检测文本文件的编码并使用 iconv 或 mbstring 转换为 UTF-8。

Mysql 数据库字符集是 UTF-8。

header('Content-type: text/html; charset=utf-8');

已添加。

试过了 iconv('UTF-8', 'UTF-8//IGNORE', $text_file_contents)

但它只是删除了乱码:当我使用 Firefox 浏览器手动检查时,它应该是 ' 或 "。Firefox 显示这是 ISO-8859-1 但我无法检查他们发送的每篇文章(文章可能是在不同的字符集中)。

如何将此字符转换为 UTF-8?

编辑: 这是我在 http://php.net/manual/en/function.mb-detect-encoding.php 最初由 prgss 在 bk dot ru 撰写。

函数 myutf8_detect_encoding($string, $default = 'UTF-8', $encode = 0, $encode_to = 'UTF-8') { 静态 $list = array('UTF-8', 'ISO-8859-1', 'ASCII', 'windows-1250', 'windows-1251', 'latin1', 'windows-1252', 'windows-1253 ','windows-1254','windows-1255','windows-1256','windows-1257','windows-1258','ISO-8859-2','ISO-8859-3','GBK '、'GB2312'、'GB18030'、'MACROMAN'、'ISO-8859-4'、'ISO-8859-5'、'ISO-8859-6'、'ISO-8859-7'、'ISO-8859 -8'、'ISO-8859-9'、'ISO-8859-10'、'ISO-8859-11'、'ISO-8859-12'、'ISO-8859-13'、'ISO-8859-14 ', 'ISO-8859-15', 'ISO-8859-16'); foreach ($list as $item) { $sample = iconv($item, $item, $string); if (md5($sample) == md5($string)) { 如果($编码 == 1) 返回 iconv($item, $encode_to, $string); 别的 返回$项目; } } 如果($编码 == 1) return iconv($encode_to, $encode_to . '//IGNORE', $string); 别的 返回$默认值; }

在我的代码中我使用:

myutf8_detect_encoding(trim($description), 'UTF-8', 1)

但它仍然返回“old is gold”这个文本的乱码。

【问题讨论】:

    标签: php


    【解决方案1】:

    遇到同样的编码检测问题,我做了一个 php 函数,它输出关于字符串的不同信息,应该可以相对容易地识别所使用的编码。

    http://php.net/manual/en/function.ord.php(函数hex_chars by "manixrock(hat)gmail(doink)com")。

    它显示字符串中字符的值,以及每个单独字节的值。您查看输出并查看哪些可疑编码与字节匹配。您应该首先熟悉各种流行的编码,如 UTF-8、UTF-16、ISO-8859-X(了解它们的字节存储)。还要确保尽可能不改变地测试字符串(注意编码可能如何在 PHP 输出和浏览器接收的内容之间发生变化,浏览器如何显示,或者如果您从其他来源(如 MySQL 或文件)获取字符串)可能会改变编码)。

    这帮助我检测到一个文本已经过转换:(UTF-8 到 byte[])然后是(ISO-8859-1 到 UTF-8)。该功能帮助很大。希望对你有帮助。

    【讨论】:

    • 在搜索如何检测编码时,我发现了这个函数: function detect_encoding($string) { static $list = array('utf-8', 'windows-1251'); foreach ($list as $item) { $sample = iconv($item, $item, $string); if (md5($sample) == md5($string)) return $item; } 返回空值; }
    • @user453984 如果您只需要在“utf-8”和“windows-1251”编码之间进行检测,那么可以。但如果是任何其他编码,或者它们的某种错误组合,则不会。
    【解决方案2】:

    这确实很棘手。

    已知使用detect_encoding... 检测任意字符串的编码不是很可靠(尽管它应该能够区分 UTF-8 和 ISO-8859-1,例如 - 确保你先试试看。)

    如果自动检测不起作用,则可以选择在内容提交之前向用户显示内容,以及用于在最常用的编码之间切换的下拉菜单。然后显示一条消息,如

    请检查您的提交。如果您看到不正确或乱码,请在下拉菜单中更改编码,直到内容正确为止。

    每当用户更改下拉值时,您的脚本会再次拉取内容,使用iconv()将其从指定编码转换为UTF-8,并输出结果,直到看起来不错。

    这需要一些技巧来设计最终用户可以理解的用户界面,但这通常是最佳选择。特别是如果您要与来自许多不同地区或大洲的用户打交道,并使用许多不同的编码。

    【讨论】:

    • 您好,感谢您的建议,但我在 php 中找不到任何带有 detect_encoding 的函数或互联网上的内容嗅探技术。
    • @user 下面的@Evert 没有推荐一个吗?
    • 如何嗅探此内容?
    • @user 也许在这里“嗅探”是错误的词。我改变了措辞。但是mb_detect_encoding() 基本上没有别的。它在内容中搜索特定字符,并尝试从中确定使用的编码。这也是为什么它经常这么不靠谱的原因
    • 嗨,即使我使用正确的 in_charset 和 iconv 进行转换,相同的字符仍然是乱码,但这次它们不同:
    【解决方案3】:

    尝试在mysql连接后立即插入:

    mysql_query("SET NAMES utf8");
    

    【讨论】:

    • 不正确。这只是告诉 mysql 文本将作为 UTF-8 提交,而 OP 不是这种情况。
    【解决方案4】:

    使用mb_detect_encoding找出使用的是什么编码,然后iconv进行转换。

    【讨论】:

    • 如何正确使用mb_detect_encoding检测字符集?
    • 来自文档:mb_detect_encoding($string, 'UTF-8, ISO-8859-1');
    • 根据我的经验,mb_detect_encoding 有点不可靠
    • 如何检测所有字符集(ISO-8859-*)?除了按什么顺序外,我应该包括所有内容吗?
    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 2010-10-01
    相关资源
    最近更新 更多