PHP中的UTF-8编码问题

时间:2010-05-16 15:26:52

标签: php utf-8

我从网址获得的字符,例如www.mydomain.com/?name=john,很好,因为它们不是俄语。

如果他们是俄语,我会得到' '。

所以我添加了$ name = iconv(“cp1251”,“utf-8”,$ name);现在它适用于俄语和英语字符,但搞砸了其他语言。 :)))

例如'Jānis'(拉脱维亚语)在iconv之前工作正常,现在变成'jДЃnis'。

是否有任何通用编码器能够兼容西里尔语并且不会搞砸其他语言?

3 个答案:

答案 0 :(得分:3)

为什么不在所有文件和进程中使用UTF-8?

答案 1 :(得分:2)

实际上这可以解决URL编码的问题。如果您单击给定页面上的链接,浏览器将使用页面的编码发送请求,但如果您将URL直接输入浏览器的地址栏,则行为在某种程度上是未定义的,因为没有标准化的方法要使用的编码(Firefox提供about:config开关以使用UTF-8编码的URL。)

除了使用某些编码检测之外,无法知道给定请求中URL使用的编码。

修改

为了备份我上面所说的,我写了一个小的测试脚本,显示了五种主要浏览器的默认行为(在我的情况下运行Mac OS X - 在IE的情况下通过Parallels运行Windows Vista):

$p = $_GET['p'];
for ($i = 0; $i < strlen($p); $i++) {
    // this displays the binary data received via the URL in hex format
    echo dechex(ord($p[$i])) . ' ';
}

致电http://path/to/script.php?p=äöü会导致

  • Safari(4.0.5):c3 a4 c3 b6 c3 bc
  • Firefox(3.6.3):c3 a4 c3 b6 c3 bc
  • Google Chrome(5.0.375.38):c3 a4 c3 b6 c3 bc
  • Opera(10.10):e4 f6 fc
  • Internet Explorer(8.0.6001.18904):e4 f6 fc

显然,前三个使用UTF-8编码的URL,而Opera和IE使用ISO-8859-1或其某些变体。 结论:您无法确定通过网址发送的文字数据的编码是什么。

答案 2 :(得分:1)

似乎问题是文件编码,您应始终使用 UTF-8无BOM 作为.php文件的首选编码,代码编辑器,例如 {{ 3}} 让你轻松指定(UTF-8 Plain)。

Intype

此外,在输出之前,请将以下代码添加到您的文件中:

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

您还应该阅读Joel Spolsky撰写的alt text http://i48.tinypic.com/ok4a4k.png