URL 查询字符串中包含希腊字符的分页按钮在 IE 浏览器中失败

问题描述 投票:0回答:3

我在我的网站中使用以下脚本来创建分页“下一个-上一个”功能。它实际上是 Dreamweaver 的代码。该脚本使用 url 获取一些值,然后重新创建它。 IE7 和 IE8 中的结果 url 包含不可读字符,最终页面无法正常工作。

$queryString_met = "";
if (!empty($_SERVER['QUERY_STRING'])) {
    $params = explode("&", $_SERVER['QUERY_STRING']);
    $newParams = array();
    foreach ($params as $param) {
        if (
            stristr($param, "pageNum_met") == false
            && stristr($param, "totalRows_met") == false
        ) {
            array_push($newParams, $param);
        }
    }
    if (count($newParams) != 0) {
        $queryString_met = "&" . htmlentities(implode("&", $newParams));
    }
}
$queryString_met = sprintf("&totalRows_met=%d%s", $totalRows_met, $queryString_met);

然后当我显示数据时,我使用:

<a href="<?php printf("%s?pageNum_met=%d%s", $currentPage, max(0, $pageNum_met - 1), $queryString_met); ?>"> << </a>

我不明白代码的哪一部分负责这个问题。

php url internet-explorer utf-8 query-string
3个回答
2
投票

htmlentities(implode("&", $newParams));

htmlentities
对字符串中的所有非 ASCII 字节进行编码,通常是不必要的,并且,如果您不指定
charset
参数,则猜测您的字符串采用 ISO-8859-1,这对于希腊语来说肯定不会是。 (希望您网站中的所有内容都使用 UTF-8。)

使用

htmlspecialchars
代替,这将保留非 ASCII 字符,只对真正需要编码的内容进行编码。

但是,要使这成为一个问题,您必须直接在 URL 中使用非 ASCII 字符。这确实不靠谱;不。未编码的非 ASCII 字符在 URI 中根本无效;它们必须是

%
编码的(例如使用
urlencode
)。 IRI 允许非 ASCII 字符,浏览器可以自动对其进行 UTF-8 编码和 % 编码以将其转换为 URI,但 IE 并不(总是)这样做。

[处理查询字符串的脚本对于任何包含目标名称的值都将失败,而不仅仅是以它们开头的值。]


1
投票

我认为您需要在 Dreamweaver 中为该页面选择文档编码:

转到

Modify->Page Properties
菜单,然后在对话框中选择
Title/Encoding
,然后选择 Western European 编码。

编辑:

还可以尝试对您的网址进行编码。


0
投票

我认为最佳实践是使用查询字符串解析器填充数组,删除具有黑名单键的元素,然后使用

http_build_query()
重建新的查询字符串以确保浏览器兼容性,然后使用
htmlspecialchars()
确保 HTML 实体编码。

通过使用联合运算符(

+
)将用户传入的参数附加到新建的查询字符串中,
pageNum_met
totalRows_met
值不能被覆盖或重复。

// Assumed variables: $currentPage, $pageNum_met, and $totalRows_met
if (!empty($_SERVER['QUERY_STRING'])) {
    parse_str($_SERVER['QUERY_STRING'], $params);
}

unset($params['pageNum_met'], $params['totalRows_met']);

$params = ['totalRows_met' => $totalRows_met] + $params;

$prevPageUrl = sprintf(
    "%s?%s",
    $currentPage,
    http_build_query(['pageNum_met' => max(0, $pageNum_met - 1)] + $params
);
$nextPageUrl = sprintf(
    "%s?%s",
    $currentPage,
    http_build_query(['pageNum_met' => max(0, $pageNum_met + 1)] + $params
);

printf('<a href="%s"> << </a>', htmlspecialchars($prevPageUrl, ENT_QUOTES, 'UTF-8'));
printf('<a href="%s"> >> </a>', htmlspecialchars($nextPageUrl, ENT_QUOTES, 'UTF-8'));
© www.soinside.com 2019 - 2024. All rights reserved.