1

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

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

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

如果您想知道,我需要控制台,因为我想使用 SQLAgent(或 taskmanager 或其他)安排脚本。

4

3 回答 3

2

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

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

As already said, PHP's unicode support is not ideal, but you can manage to do it in PHP5 with a few well placed function call of utf8_decode. The secret of character encoding is to understand well what is the current encoding of all the tools you are using: database, database connection, current bytes in your PHP variable, your output to the console screen, your email's body encoding, your email client, and so on...

For everything that have special characters, in our modern days, something like UTF8 is often recommended. Make sure everything along the way is set to UTF8 and convert only where necessary.

于 2008-12-13T03:08:54.710 回答
1

PHP 对非英语世界的糟糕支持是众所周知的。我从未使用过包含基本 ASCII 领域之外的字符的数据库,但显然你已经有一个解决方法,而且似乎你只需要忍受它。

如果您想更进一步,您可以: 1. 编写一个包含所有特殊字符及其 CHR 等效项的数组 2. foreach 数组和 str_replace 查询

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

于 2008-12-03T22:42:07.417 回答
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-printable 编码功能,虽然奇怪的是,它确实用于解码),如果你不是在谈论 utf-8 <=> latin-1 你会想改用 mbstring 函数。

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

于 2008-12-13T01:14:08.187 回答