像ÖÄÅ这样的人物问题

时间:2010-09-05 09:57:49

标签: php character-encoding

我的表格

<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 &amp;&amp; this.value.length >= 1));" style="width: 130px;" />
</form>

当我在saveProfile.php上尝试echo $_POST["Smeknamn"];时,我会在字符Ã�Ã�Ã�上获得Ö Ä Å

为什么会这样? saveProfileeditProfile以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;
}

2 个答案:

答案 0 :(得分:2)

尝试将editProfile.phpsaveProfile.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替换为引用&Atilde;。但是没有任何实体代表第二个字符0x96,所以它没有被替换。这意味着:

htmlentities("\xC3\x96") === "&Atilde;\x96"

现在,当用户代理解释了这一点时,字符引用会正确显示,但剩余的字节0x96不是UTF-8中字符的有效字节序列。这就是显示替换字符的原因。

所以问题是你没有为htmlentities指定正确的字符编码:

htmlentities("\xC3\x96", ENT_COMPAT, "UTF-8") === "&Ouml;"

但由于您已经在输出中使用了UTF-8,因此无需替换此类字符,而使用htmlspecialchars代替HTML特殊字符就足够了。

除此之外,你不应该使用这种类似通用的过滤函数,因为每种语言和上下文都有自己需要处理的特殊字符。