Вопрос

У меня есть скрипт php, который обращается к базе данных MSSQL2005, считывает некоторые данные из нее и отправляет результаты по почте.

В некоторых именах столбцов и в самих полях есть специальные символы.

Когда я получаю доступ к сценарию через браузер (веб-сервер iis), запрос выполняется правильно, а содержимое письма корректно (для моей аудитории) кодируется. Однако, когда я выполняю php из консоли, запрос не выполняется (из-за специальных символов в именах столбцов). Если я заменю специальные символы в запросе вызовами chr () и символьным кодом в латинице-1, запрос будет выполнен правильно, но результаты также будут закодированы в латинице-1 и, следовательно, не будут правильно отображаться в почте. Почему PHP / драйвер MSSQL / & # 8230; использовать разные кодировки в двух сценариях? Есть ли способ обойти это?

Если вам интересно, мне нужна консоль, потому что я хочу запланировать сценарий с помощью SQLAgent (или TaskManager или чего-то еще).

Это было полезно?

Решение

В зависимости от типа символов в вашей базе данных, это может быть ограничение консоли, я думаю. Если вы введете в консоли chcp, вы увидите, что такое активная кодовая страница, которая может выглядеть примерно так: CP437 также известен как расширенный ASCII. Если у вас есть символы вне этой кодовой страницы, как в UTF8, вы можете столкнуться с проблемами. Вы можете изменить текущую активную кодовую страницу, набрав chcp 65001, чтобы переключиться на UTF8.

Возможно, вы также захотите изменить шрифт Raster по умолчанию на Lucida Console в зависимости от требуемых символов, поскольку не все шрифты поддерживают расширенные символы (щелкните правой кнопкой мыши заголовок окна командной строки, свойства, шрифт).

Как уже говорилось, поддержка юникода в PHP не идеальна, но вы можете сделать это в PHP5 с помощью нескольких хорошо расположенных функций: utf8_decode . Секрет кодировки символов заключается в том, чтобы хорошо понять, какова текущая кодировка всех инструментов, которые вы используете: база данных, соединение с базой данных, текущие байты в переменной PHP, ваш вывод на экран консоли, ваша электронная почта кодировка тела, ваш почтовый клиент и т. д. ...

Для всех, у кого есть специальные символы, в наши дни часто рекомендуется что-то вроде UTF8. Убедитесь, что все в пути установлено в UTF8, и конвертируйте только при необходимости.

Другие советы

Плохая поддержка PHP не англоязычного мира хорошо известна. Я никогда не использовал базу данных с символами вне основной области ASCII, но, очевидно, у вас уже есть обходной путь, и кажется, что вам просто нужно с этим жить.

Если вы хотите сделать еще один шаг вперед, вы можете: 1. Напишите массив, который содержит все специальные символы и их эквиваленты CHR 2. foreach массив и str_replace по запросу

Но если запрос жестко запрограммирован, я думаю, у вас все в порядке. Также убедитесь, что вы используете последнюю версию PHP, по крайней мере, 4.4.x, всегда есть исправление, которое было исправлено, но я просмотрел примечания к выпуску 4.x.x и не вижу ничего, что относится к вашей проблеме.

В PHP-строках нужно помнить, что они представляют собой потоки байтов. Если вы хотите получить данные в правильном наборе символов (для всего, что вы делаете), вы должны сделать это явно через какую-то функцию или фильтр. Это все довольно низкого уровня.

В зависимости от настроек вам может понадобиться знать внутренний набор символов строк в базе данных, но, по крайней мере, вам нужно знать, какой набор символов отправляет база данных в PHP (потому что, помните, для PHP это просто поток байтов).

Затем вы должны знать целевой набор символов (и, возможно, указать его, что вам действительно нужно в любом случае). Например, предположим, что вы получаете utf-8 из базы данных, но хотите отправить латинский-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 при вводе специальных символов с консоли, что, вероятно, зависит от настроек оболочки и / или PHP. Но помните, что PHP понимает строки только как байтовый байтовый байт, и вы должны быть в состоянии разобраться с этим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top