我的表格
<form action="saveProfile.php" method="post" name="ProfileUpdate" id="ProfileUpdate" >
<input name="Smeknamn" id="Smeknamn" type="text" value="<?php echo $v["user_name"]; ?>" maxlength="16" id="ctl00_ctl00_cphContent_cphContent_cphContentLeft_tbUsername" onkeydown="return ((event.keyCode != 16) || (event.keyCode == 16 && this.value.length >= 1));" style="width: 130px;" />
</form>
当我在saveProfile.php上尝试echo $_POST["Smeknamn"];
时,我会在字符Ã�Ã�Ã�
上获得Ö Ä Å
为什么会这样? saveProfile
和editProfile
以UTF-8编码,没有BOM,meta utf8和所有这些。
更新更新
$ smeknamn = $ data [“Smeknamn”]
抱歉忘了提到我有这个foreach。 它的$ smeknamn我回应并得到à à à 。 我只是尝试了$ _POST [“Smeknamn”]并且它回应了ÖÄÅ就好了。所以现在问题出现在foreach()中,这使得öäåcharsà à à 。我该如何解决这个问题?
foreach($_POST as $key => $value) {
$data[$key] = filter($value);
}
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data = mysql_real_escape_string($data);
return $data;
}
答案 0 :(得分:2)
尝试将editProfile.php
和saveProfile.php
编码为带有BOM的UTF-8。
答案 1 :(得分:1)
这是一个字符编码问题。
我猜你的数据实际上是用UTF-8编码的,所以字符Ö
(U + 00D6)用0xC396编码。现在,在未指定 charset 参数的情况下调用htmlentities
时,它隐式使用ISO 8859-1:
[...]可选的第三个参数
charset
,它定义了转换中使用的字符集。目前,ISO-8859-1字符集用作默认值。
当用ISO 8859-1解释字节序列0xC396时,它表示两个ISO 8859-1字符0xC3和0x96。由于ISO 8859-1字符0xC3有实体 Atilde ,因此该字符将被htmlentities
替换为引用Ã
。但是没有任何实体代表第二个字符0x96,所以它没有被替换。这意味着:
htmlentities("\xC3\x96") === "Ã\x96"
现在,当用户代理解释了这一点时,字符引用会正确显示,但剩余的字节0x96不是UTF-8中字符的有效字节序列。这就是显示替换字符�
的原因。
所以问题是你没有为htmlentities
指定正确的字符编码:
htmlentities("\xC3\x96", ENT_COMPAT, "UTF-8") === "Ö"
但由于您已经在输出中使用了UTF-8,因此无需替换此类字符,而使用htmlspecialchars
代替HTML特殊字符就足够了。
除此之外,你不应该使用这种类似通用的过滤函数,因为每种语言和上下文都有自己需要处理的特殊字符。