У меня есть php-скрипт, который обращается к базе данных MSSQL2005, считывает из нее некоторые данные и отправляет результаты по электронной почте.
Специальные символы присутствуют как в именах некоторых столбцов, так и в самих полях.
Когда я получаю доступ к сценарию через свой браузер (веб-сервер iis), запрос выполняется правильно, и содержимое письма правильно (для моей аудитории) закодировано. Однако, когда я запускаю php с консоли, запрос не выполняется (из-за специальных символов в именах столбцов). Если я заменю специальные символы в запросе на вызовы chr () и код символа в latin-1, запрос будет выполнен правильно, но результаты также будут закодированы в latin-1 и, следовательно, не будут правильно отображаться в почте. Почему PHP / драйвер MSSQL /… использует разную кодировку в двух сценариях? Есть ли способ обойти это?
Если вам интересно, мне нужна консоль, потому что я хочу запланировать сценарий с помощью SQLAgent (или диспетчера задач, или чего-то еще).
Кроме того, какую версию PHP вы используете в консоли? Вы можете узнать, набрав «php -v».






Плохая поддержка PHP для неанглоязычного мира хорошо известна. Я никогда не использовал базу данных с символами за пределами базовой области ASCII, но, очевидно, у вас уже есть работа, и, похоже, вам просто нужно с ней жить.
Если вы хотите пойти дальше, вы можете: 1. Напишите массив, содержащий все специальные символы и их эквиваленты CHR. 2. foreach для массива и str_replace в запросе
Но если запрос жестко запрограммирован, я думаю, что у вас все в порядке. Кроме того, убедитесь, что вы используете последнюю версию PHP, по крайней мере 4.4.x, всегда есть изменение, которое было исправлено, но я просмотрел примечания к выпуску 4.x.x и не вижу ничего, что связано с вашей проблемой.
О строках 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, когда вы вводите специальные символы с консоли, что, вероятно, зависит от настроек оболочки и / или PHP. Но помните, что PHP понимает строки только как байтовые байты, и вы должны иметь возможность работать с этим.
Разве в UTF-8 не больше символов latin-1? Все первые символы UTF-8 такие же, как ASCII, и вы также можете найти все символы latin-1, но UTF-8 - это кодировка символов переменной длины, которая может представлять любой символ в стандарте Unicode, то есть более 100000.
Я полагаю, что в зависимости от типа символов, которые есть в вашей базе данных, это может быть ограничение консоли. Если вы наберете chcp в консоли, вы увидите активную кодовую страницу, которая может выглядеть как CP437, также известная как Extended ASCII. Если у вас есть символы вне этой кодовой страницы, например, в UTF8, вы можете столкнуться с проблемами. Вы можете изменить текущую активную кодовую страницу, набрав chcp 65001, чтобы переключиться на UTF8.
Вы также можете изменить растровый шрифт по умолчанию на Lucida Console в зависимости от требуемых символов, поскольку не все шрифты поддерживают расширенные символы (щелкните правой кнопкой мыши заголовок окна командной строки, свойства, шрифт).
Как уже было сказано, поддержка юникода в PHP не идеальна, но вы можете сделать это в PHP5 с помощью нескольких хорошо размещенных вызовов функций utf8_decode. Секрет кодировки символов состоит в том, чтобы хорошо понимать, какова текущая кодировка все, инструменты, которые вы используете: база данных, соединение с базой данных, текущие байты в вашей переменной PHP, ваш вывод на экран консоли, кодировка тела вашего письма, ваш почтовый клиент, и так далее...
Для всего, что имеет специальные символы, в наши дни часто рекомендуется что-то вроде UTF8. Убедитесь, что все по пути настроено на UTF8, и конвертируйте только там, где это необходимо.
Было бы полезно, если бы вы указали исходную кодировку (в своей базе данных), которую вы используете, и пример того, что не отображается правильно в консоли, но находится в вашем браузере.