除了编码之外,是否有操纵urlencode结果的因素


Are there factors except the encoding which manipulate the result of urlencode?

情况:我正在开发一个PHP脚本,它通过odbc接口连接到mssql数据库。匹配收集的数据后,这些数据通过 REST 接口传输到外部服务器。该脚本在 Windows 客户端上运行。到目前为止,一切正常。

问题:在发送数据之前,我使用函数 urlencode() 转换德语特殊字符,如 ö,ä,ü 和 ß。由于某种原因,这不适用于从数据库中读出的数据。以下工作正常:

echo urlencode("Münzener"); 

等于:"M%C3%BCnzener"是正确的。

现在我想对数据库中的结果进行编码:

$connection_string = "DRIVER={SQL Server};SERVER=".LOCAL_HOST.";DATABASE=".LOCAL_DATABASE; 
$conn = odbc_connect($connection_string, LOCAL_USER, LOCAL_PASSWORD);
$sqlH = odbc_exec($conn, "SELECT field FROM table; ");
while($row = odbc_fetch_array($sqlH)) {
    /* var_dump($row["field"]) equals string(8) "Münzener"*/
    echo urlencode($row["field"]); 
}

等于:"M%81nzener",这是不正确的。

我知道有很多关于堆栈溢出的主题来处理类似的问题。因此,我尝试了以下方法:

1) 检测字符集并将其转换为 UTF-8。结果:mb_detect_encoding()说,我有ASCII。 iconv('ASCII', 'UTF-8', $string);返回 PHP 通知:

iconv():在输入字符串中检测到非法字符

如果添加 UTF-8//忽略字符,则缺少字符。UTF-8//translit 返回不同的字符。 mb_convert_encoding()的行为方式相同。

2)函数utf8_encode()将字符串转换为"M%C2%81nzener",这是不正确的。"%C2%81"看起来更好,但不是"%C3%BC"是正确的。

3)我尝试在odbc_connect()方法中传递字符集。不太可能什么都没有改变。去年,我在使用csv文件时遇到了几乎相同的问题。所以我不认为这是问题所在。

所以我的主要问题是:在这种情况下编码有什么问题?除了编码之外,还有其他东西会导致urlencode()这样的问题吗?

简而言之:您的 ODBC 连接不会以与预期相同的编码返回数据,它可能会以某些 ANSI 代码页的某种奇怪的特殊编码返回数据。 ASCII iconv不起作用,因为 ASCII 不包含字母 ü。无论如何,检测编码是不可靠的,所以不要注意它。 utf8_encode仅适用于拉丁语-1,显然 ODBC 不会返回。

更改连接编码将是解决此问题的首选方法;让数据库为您提供所需的编码。另一种方法是像您尝试的那样手动转换编码,但是您需要弄清楚需要从哪种编码转换