2016-03-15 111 views
0

情况:我正在开发一个通过odbc接口连接到mssql数据库的PHP脚本。匹配收集的数据后,这些数据通过REST接口传输到外部服务器。该脚本在Windows客户端上运行。到目前为止,一切正常。除了处理urlencode结果的编码之外,还有其他因素吗?

问题:在我发送数据之前,我使用函数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()之外的编码还有其他问题吗?

+0

1)阅读'mb_detect_encoding()'和'utf8_encode()'手册页,你会意识到他们不会做你认为他们会按名称判断的事情2)我没有理由怀疑任何奇怪的东西:如果'urlencode()'产生不同的输出结果,你就用不同的输入来输入它。我敢打赌,你还没有决定你的应用程序的字符集,你只是在各地使用默认值。 –

+1

'echo bin2hex($ row ['field'])' - 这是什么给你的? - 简而言之:您的odbc连接不会像您期望的那样使用相同的编码返回数据,它可能会以某种ANSI代码页的某种奇怪的专业编码形式返回。 ASCII中的'iconv'不起作用,因为ASCII不包含字母ü。无论如何,检测编码是不可靠的,所以不要关注它。 'utf8_encode'只适用于Latin-1,显然odbc不会返回。 – deceze

+0

它给出了最初代表“Thomas-Müntzer-S”的字符串(32)“54686f6d61732d4d816e747a65722d53”。现在我明白了为什么这不起作用。所以 我唯一的机会是改变连接的编码? –

回答

1

简而言之:您的ODBC连接不会像您期望的那样以相同的编码返回数据,它可能会以某种ANSI代码页的某种奇怪的专业编码形式返回它。来自ASCII的iconv不起作用,因为ASCII不包含字母ü。无论如何,检测编码是不可靠的,所以不要关注它。 utf8_encode只适用于Latin-1,显然ODBC不返回。

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

相关问题