情况:我正在开发一个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”这是不正确的。
我知道stackoverflow上有很多主题可以解决类似的问题。因此,我尝试了以下内容:
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()
中的问题吗?
答案 0 :(得分:1)
简而言之:您的ODBC连接不会以您期望的相同编码返回数据,它可能会以某些ANSI代码页的某些奇怪的特殊编码返回它。 ASCII中的iconv
不起作用,因为ASCII不包含字母ü。无论如何,检测编码是不可靠的,所以不要注意它。 utf8_encode
仅适用于Latin-1,显然ODBC不会返回。
更改连接编码是解决此问题的首选方法;让数据库为您提供所需的编码。另一种方法是按照您的尝试手动转换编码,但是您需要确定从转换所需的编码。