PHP问题字符集

时间:2010-10-04 10:17:52

标签: php

我有一个用户上传压缩文本文件的问题。在我提取文本内容后,我将它们导入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)

但它仍然会返回此文字中的乱码“老是金”。

4 个答案:

答案 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");