PHP,MSSQL2005和Codepages

时间:2008-12-03 22:09:36

标签: php sql-server encoding codepages

我有一个php脚本访问MSSQL2005数据库,从中读取一些数据并通过邮件发送结果。

某些列名称和字段本身都有特殊字符。

当我通过浏览器(webserver iis)访问脚本时,查询正确执行,邮件内容正确(对我的受众)编码。 但是,当我从控制台执行php时,查询失败(由于列名中的特殊字符)。如果我通过调用chr()和latin-1中的字符代码替换查询中的特殊字符,则查询会正确执行,但结果也会以latin-1编码,因此无法在邮件中正确显示。 为什么PHP / MSSQL驱动程序/ ...在两种情况下使用不同的编码?有办法解决吗?

如果你想知道,我需要控制台,因为我想使用SQLAgent(或任务管理器或其他)安排脚本。

3 个答案:

答案 0 :(得分:2)

根据您在数据库中的字符类型,我猜可能是控制台限制。如果在控制台中键入chcp,您将看到活动代码页是什么,可能类似CP437,也称为扩展ASCII。如果你有这个代码页的字符,就像在UTF8中那样,你可能会遇到问题。您可以通过键入chcp 65001来切换到UTF8来更改当前活动代码页。

您可能还希望将默认的Raster字体更改为Lucida Console,具体取决于所需的字符,因为并非所有字体都支持扩展字符(右键单击命令提示符窗口的标题,属性,字体)。

正如已经说过的那样,PHP的unicode支持并不理想,但你可以设法在PHP5中使用utf8_decode的几个函数调用来完成它。字符编码的秘诀在于理解你正在使用的工具所有的当前编码是什么:数据库,数据库连接,PHP变量中的当前字节,控制台屏幕的输出,电子邮件的正文编码,您的电子邮件客户端等等......

对于所有具有特殊字符的东西,在我们的现代,经常推荐像UTF8这样的东西。确保沿途的所有内容都设置为UTF8并仅在必要时进行转换。

答案 1 :(得分:1)

PHP对非英语世界的不良支持是众所周知的。我从来没有使用过基本ASCII领域以外的字符的数据库,但显然你已经有了一个解决方案,看起来你只需要忍受它。

如果你想更进一步,你可以: 1.写一个包含所有特殊字符及其CHR等价物的数组 2.在查询上预先处理数组和str_replace

但是如果查询是硬编码的,我猜你的确很好。此外,请确保您使用的是最新的PHP,至少4.4.x,总是有一个更改,但是我修改了4.x.x发行说明,但我没有看到任何与您的问题相关的内容。

答案 2 :(得分:1)

要记住关于PHP字符串的事情是它们是字节流。如果您想以正确的字符集(无论您正在做什么)获取数据,您必须通过某种函数或过滤器明确地执行此操作。这一切都很低级。

根据您的设置,您可能需要知道数据库中字符串的内部字符集,但至少您需要知道数据库发送给PHP的字符集(因为,请记住,它是PHP的只是一个字节流。)

然后你必须知道目标字符集(并且可能指定它,你真的应该这样做)。例如,假设您从数据库获取utf-8,但希望发送latin-1(因此base64或q-printable编码为'Content-transfer-encoding'):

$send_string = base64_encode(utf8_decode($database_string));

当然在这种情况下,你必须知道所有的utf-8字符都存在于latin-1字符集中,你可能不会真的想要base64(不幸的是PHP没有一个好的q-可打印的编码功能,虽然奇怪的是,它确实用于解码),如果你不是在谈论utf-8< => latin-1你想要改为使用mbstring函数。

就控制台而言,当您从控制台输入特殊字符时,您必须知道PHP会得到什么,这可能取决于shell和/或PHP设置。但请记住,PHP只能将字符串理解为字节字节字节,您应该能够解决它。