【发布时间】:2016-03-15 13:17:28
【问题描述】:
情况:我正在开发一个 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() 中引起类似问题的编码之外,是否还有其他内容?
【问题讨论】:
-
1) 阅读
mb_detect_encoding()和utf8_encode()手册页,您会发现他们不会做您认为他们会做的事情 2) 我认为没有理由怀疑任何奇怪的事情:如果urlencode()产生不同的输出,那么你就用不同的输入来喂它。我敢打赌你还没有决定你的应用程序字符集,你只是在到处使用默认值。 -
echo bin2hex($row['field'])– 这给了你什么? – 简而言之:您的 odbc 连接不会以您期望的相同编码返回数据,它可能以某些 ANSI 代码页的某种奇怪的特殊编码返回数据。来自 ASCII 的iconv不起作用,因为 ASCII 不包含字母 ü。无论如何检测编码是不可靠的,所以不要理会它。utf8_encode仅适用于 Latin-1,显然 odbc 不会返回。 -
它给出了字符串(32)“54686f6d61732d4d816e747a65722d53”,它最初代表“Thomas-Müntzer-S”。现在我意识到为什么这不起作用。所以我唯一的机会是改变连接的编码?
-
更改连接编码确实是首选方法;让数据库为您提供所需的编码。另一种方法是按照您一直在尝试的方式手动转换编码,但是您需要弄清楚您需要什么编码来转换 from。
-
好的,非常感谢,现在我知道在哪里搜索了。您可以复制您的评论作为答案吗?那我就标记为正确...
标签: php encoding utf-8 character-encoding