我有一个用户上传压缩文本文件的问题。在我提取文本内容后,我将它们导入mysql数据库。但是后来当我在浏览器中显示文本时,一些字符会出现乱码。我尝试对它们进行编码,但我无法使用PHP检测文本文件的编码,并使用iconv或mbstring转换为UTF-8。
Mysql数据库charset是UTF-8。
header('Content-type: text/html; charset=utf-8');
已添加。
试过 iconv('UTF-8','UTF-8 // IGNORE',$ text_file_contents)
但是它只是删除了乱码:当我用Firefox浏览器手动检查时,它应该是'或'。火狐显示是ISO-8859-1但我无法检查他们发送的每篇文章(文章可能是在不同的字符集)。
如何将此字符转换为UTF-8?
编辑: 这是我发现的修改过的功能 http://php.net/manual/en/function.mb-detect-encoding.php 最初由prgss在bk dot ru撰写。
function myutf8_detect_encoding($string, $default = 'UTF-8', $encode = 0, $encode_to = 'UTF-8') { static $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)) { if ($encode == 1) return iconv($item, $encode_to, $string); else return $item; } } if ($encode == 1) return iconv($encode_to, $encode_to . '//IGNORE', $string); else return $default; }
在我的代码中我使用:
myutf8_detect_encoding(trim($description), 'UTF-8', 1)
但它仍然会返回此文字中的乱码“老是金”。
答案 0 :(得分:2)
这确实很棘手。
使用detect_encoding...
检测任意字符串的编码已知不太可靠(尽管 能够区分UTF-8和ISO-8859-1 - 例如 - make一定要先尝试一下。)
如果自动检测不起作用,可以选择在提交之前向用户显示内容,还有一个下拉菜单,用于在最常用的编码之间切换。然后显示一条消息,如
请检查您的提交。如果您看到不正确或乱码的字符,请在下拉菜单中更改编码,直到内容正确。
每当用户更改下拉值时,您的脚本将再次提取内容,使用iconv()
将其从指定的编码转换为UTF-8,然后输出结果,直到它看起来很好。
在设计用户界面时需要一些技巧才能为最终用户理解,但这通常是最佳选择。特别是如果您正在处理来自许多不同地区或大陆的用户,这些用户有很多不同的编码。
答案 1 :(得分:0)
我遇到了相同的编码检测问题,我制作了一个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)。这个功能帮了很大忙。希望它可以帮到你。
答案 2 :(得分:-1)
使用mb_detect_encoding查找使用的编码,然后使用iconv进行转换。
答案 3 :(得分:-1)
尝试在mysql连接后插入:
mysql_query("SET NAMES utf8");