Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中UTF-8编码的问题_Php_Utf 8 - Fatal编程技术网

PHP中UTF-8编码的问题

PHP中UTF-8编码的问题,php,utf-8,Php,Utf 8,我从URL获得的字符,例如www.mydomain.com/?name=john,很好,因为它们不是俄语 如果他们是俄语的,我会����'. 所以我添加了$name=iconv(“cp1251”,“utf-8”,“$name”);现在它对俄语和英语字符都很好,但却把其他语言搞砸了。:) 例如,在iconv之前运作良好的“Jānis”(拉脱维亚语)现在变成了“JāЃnis” 你知道是否有一种通用的编码器可以同时使用西里尔语和其他语言,而不会搞乱其他语言吗?为什么不在所有文件和进程中使用UTF-8呢

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

如果他们是俄语的,我会����'.

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

例如,在iconv之前运作良好的“Jānis”(拉脱维亚语)现在变成了“JāЃnis”


你知道是否有一种通用的编码器可以同时使用西里尔语和其他语言,而不会搞乱其他语言吗?

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

似乎问题在于文件编码,您应该始终使用UTF-8无BOM作为
文件的首选编码。php
文件的代码编辑器(如可以轻松指定此编码(UTF-8普通)

另外,在任何输出之前向文件中添加以下代码:

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


您还应该阅读Joel Spolsky的文章。

实际上,这可以归结为URL的编码问题。如果您单击给定页面上的链接,浏览器将使用该页面的编码发送请求,但如果您直接在浏览器的地址栏中输入URL,则该行为不知何故是未定义的,因为在编码方面没有标准化的使用方法(Firefox提供了一个
about:config
开关以使用UTF-8编码的URL)

除了使用一些编码检测之外,没有办法知道给定请求中URL使用的编码

编辑:

header('Content-Type: text/html; charset=utf-8');
为了备份我上面所说的内容,我编写了一个小测试脚本,其中显示了五种主要浏览器的默认行为(在我的情况下运行Mac OS X,在IE情况下通过Parallels运行Windows Vista):

$p=$\u GET['p'];
对于($i=0;$i
呼叫
http://path/to/script.php?p=äöü
导致

  • 狩猎(4.0.5):
    c3a4c3b6c3bc
  • 火狐(3.6.3):
    c3a4c3b6c3bc
  • 谷歌浏览器(5.0.375.38):
    c3a4c3b6c3bc
  • Opera(10.10):
    E4F6FC
  • Internet Explorer(8.0.6001.18904):
    e4 f6 fc

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

aaa。。。我该怎么做?*不好意思,这是问题还是答案?这是答案。很明显,可以用疑问的形式来表达。我高度怀疑这与浏览器编码有关,我猜内容类型标题没有使用utf-8字符集。这取决于他调用PHP脚本的确切方式。如果他输入
http://www.mydomain.com/?name=当他进入浏览器的地址栏时,这将是一个浏览器编码问题,因为他不知道使用哪种编码发送请求。如果他点击了一个链接,上面提到了
href
,例如,“我支持你”-那么问题似乎出在页面的编码上。尝试过之后,在FF 3.6中,无论哪种方式,如果我正确设置了内容类型,这两种情况都会起作用。谢谢大家的回答。若它是一个点击的链接,而不是仅仅键入URL,那个么它看起来很好。再次感谢!