PHP, MSSQL2005 и кодовые страницы

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

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

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

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

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

lpfavreau 13.12.2008 06:24

Кроме того, какую версию PHP вы используете в консоли? Вы можете узнать, набрав «php -v».

lpfavreau 13.12.2008 06:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
472
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Плохая поддержка 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.

lpfavreau 13.12.2008 06:22
Ответ принят как подходящий

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

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

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

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

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