我想在PHP中输出以下字符串:
?? ü? 欧元
因此,我将其手动编码为utf8:
?¤?? ?? ?? ?€
所以我的脚本是:
header('content-type: text/html; charset=utf-8');
echo '?¤ ?? ?? ?? ?€';
?>
前4个字符正确(??ü?),但不幸的是€符号不正确:
?? ü?
在这里您可以看到它。
你能告诉我我做错了什么吗? 我的编辑器(Notepad ++)具有编码(Ansi / UTF-8)和格式(Windows / Unix)的设置。 我需要更改它们吗?
我希望你能帮助我。 提前致谢!
您应该使用支持UTF-8的编辑器。 您所做的只是使用ISO 8859-1编写UTF-8的代码字。 使用UTF-8,您可以直接编写€。
啊,抱歉,它是Windows-1252而不是ISO 8895-1
但是请注意,使用UTF-8可能会在文件开头插入U + FEFF。 而PHP根本不喜欢那样。
@Johannes-我从来没有遇到过问题。 您在使用UTF-8编码的文件时遇到什么问题?
@warpech / @Johannes Rssel:这是字节顺序标记(BOM)。 这里是有关它的更多信息:decodeunicode.org/de/U+FEFF在Notepad ++中,您可以选择"无BOM的UTF-8"作为编码,并且不会遇到任何问题。
最后一个字符只是不在文件中(尝试查看源代码),这就是为什么看不到它的原因。
我认为您最好将PHP文件另存为UTF-8(在Notepad ++中,该选项在"格式->在没有BOM的UTF-8中编码"中可用),然后在PHP文件中插入实际字符(例如,在Notepad ++中),而不是随处插入?。您可能会发现Windows字符映射对于插入Unicode字符很有用。
为什么要下票? 我有什么问题吗?
不,我不这么认为。 一切安好。 感谢您使用Notepad ++的技巧!
欧元符号(U + 20AC)以UTF-8编码,带有三个字节,而不是两个字节。可以在这里看到。因此,您的编码是完全错误的。
谢谢,这似乎是原因。 :)
对于任何处理文本以从输入中删除无效字节序列的情况,这种情况并不少见。 因此,当您将广告宣传为UTF-8并包含无效的UTF-8时,请不要期望它在那里。
如果要将其正确输出到utf8,则脚本应为:
header('content-type: text/html; charset=utf-8');
echo"\xc3\xa4"."\xc3\xb6"."\xc3\xbc"."\xc3\x9f"."\xe2\x82\xac";
?>
这样,即使您的php脚本保存为非utf-8编码,它仍然可以工作。
谢谢。 回声线到底能做什么?
它回显utf8中编码的以下每个字符:€。 在您最初的问题中,您说过"我已经将其手动编码为utf8"。 要真正做到这一点,请转到utf8-chartable.de并搜索,您将在utf8中看到它是" xc3 xa4";
您应该始终将编辑器设置为与生成的HTML指示浏览器使用的编码相同的编码。如果打算将HTML页面解释为UTF-8,则将文本编辑器设置为UTF-8。 PHP完全不知道用于创建文件的编辑器的编码设置。它将字符串视为字节流。
换句话说,只要文件中包含正确的字节,一切都会起作用。确保文件中包含正确字节的最简单方法是将编码设置为网页应使用的编码。其他任何方法都会使生活变得比原来更加困难。
但是最好的防御方法是将非ASCII字符完全排除在代码之外。您可以将它们拉出数据库或本地化文件。这意味着基本上可以在任何编辑器中修改代码,而不必担心损坏编码。
谢谢,我将来会这样做。 它将真正使编码更容易。
这对我有用
if (mb_check_encoding($value, 'UTF-8')) {
return $value = utf8_encode($value);
}
else {
return $value;
}
来源:https://github.com/jdorn/php-reports/issues/100
header('Content-Type: text/html; charset=UTF-8');
这只是告知浏览器您将要发送哪种内容以及如何处理。它不会设置您要发送的实际内容的编码。完全取决于您自己的诺言。您的内容不会因为设置了标题而神奇地从任何内容转换为UTF-8。如果您告诉浏览器将内容视为UTF-8,但要发送的是Latin-1编码的数据,则它肯定会损坏。
我指的是每个程序员绝对肯定要了解的与文本一起使用的编码和字符集的知识