Как я могу запросить базу данных SQL Server и заставить апострофы НЕ отображаться в виде вопросительных знаков?

#php #sql-server #encoding #utf-8

#php #sql-server #кодирование #utf-8

Вопрос:

К сожалению, я использую источник данных на основе MSSQL и пытаюсь интегрировать его в пользовательский модуль Drupal, написанный на PHP. Моя проблема в том, что независимо от того, какую функцию-оболочку я использую, я НЕ МОГУ заставить апострофы правильно отображаться на странице. Все они превращаются в вопросительные знаки. Кроме того, emdashes выполняет то же самое.

Я знаю, что это проблема с кодировкой. Страница закодирована в UTF-8, но база данных закодирована в SQL_Latin1_General_CP1_CI_AS. У меня нет контроля над структурой базы данных, и ее нельзя изменить. У меня нет возможности изменить все значения в базе данных.

Как я могу получить доступ к этим данным в неповрежденной форме или, по крайней мере, заставить PHP правильно их отображать?

Я безуспешно пытался: utf_encode utf_decode html_entities iconv несколько пользовательских функций str_replace, закодированных пользователем MSSQL, не имеют функции SET NAMES

Помогите!

Комментарии:

1. как насчет mb_convert_encoding() ? может сработать преобразование utf-8 в iso-8859-1.

2. Можете ли вы опубликовать код, который вы использовали для опробования iconv() ?

3. iconv('UTF-8', 'ISO-8859-1', $string) не сработало.

4. iconv('ISO-8859-1', 'UTF-8', $string) тоже не сработало.

Ответ №1:

Вы пробовали явно приводить выходные данные? Например:

 select col1 COLLATE Latin1_General_100_CI_AS from table1
  

Согласно странице сортировки и поддержки Unicode в MSDN, поддерживается Unicode 5.0, хотя вам может потребоваться принудительно использовать более новые параметры сортировки * _100, чтобы воспользоваться преимуществами новых функций. На другой странице утверждается, что SQL Server не поддерживает UTF-8, но поддерживается UTF-16.

Вы можете просмотреть весь список поддерживаемых параметров сортировки с помощью встроенного TVF:

 select * from fn_helpcollations()
  

Комментарии:

1. Похоже, это не помогает. Я добавил это ко всем своим запросам, и оно по-прежнему показывает вопросительные знаки при отображении с помощью PHP.

2. Недопустимая сортировка ‘Latin1_General_100_CI_AS’. : (

3. Какую версию SQL Server вы используете?

4. Я полагаю, что это SQL Server 2005.

5. Latin1_General_100_CI_AS не существует, но Latin1_General_CI_AS существует. Однако это ничего не меняет, вопросительные знаки по-прежнему отображаются вместо фигурных кавычек и тире.

Ответ №2:

Поскольку вы используете более старую версию SQL Server, которая не поддерживает новые параметры сортировки, вы пытались преобразовать эти данные в NVARCHAR?

Например:

 SELECT CONVERT(NVARCHAR(MAX), col1) FROM table1
  

Существует страница MSDN, посвященная управлению преобразованием данных между кодовыми страницами клиент / сервер, которая предоставляет некоторую общую информацию. В целом, рекомендация, похоже, сосредоточена на изменении либо специфики соединения, либо структуры базы данных (что, как вы сказали, невозможно с учетом текущих ограничений). В частности,

Лучший выбор для сервера, зависящего от кодовой страницы, — взаимодействовать только с клиентами, использующими ту же кодовую страницу. Второй лучший вариант — использовать другую кодовую страницу с почти таким же набором символов. […] Если вам необходимо взаимодействовать с клиентами, использующими разные кодовые страницы, поддерживаемым решением является хранение ваших данных в столбцах Unicode. Если какой-либо из этих вариантов невозможен, другой альтернативой является хранение данных в двоичных столбцах с использованием типов данных binary, varbinary или varbinary (max). Однако двоичные данные можно сортировать и сравнивать только в двоичном порядке. Это делает его менее гибким, чем символьные данные.