Как определить кодировку страницы с помощью PHP?


Хотел бы создать функцию, которая сохранить данные в базе всегда encoding правильный (мой банк UTF-8) encoding обнаружен.

Есть ли функция встроенной в PHP мне сделать это? Есть ли другой способ?

Author: UzumakiArtanis, 2013-12-19

5 answers

Предполагая, что ваш сервер обслуживает страницы в кодировке UTF-8, поведение по умолчанию для большинства пользовательских агентов (браузеры etc) будет использовать эту же кодировку при отправке данных обратно на сервер (через формы/ПОСТ, например). Также можно согласиться с другими кодировками через параметр accept-charset. Таким образом, не будет необходимости "обнаружить" ничего, ты сам инструктаж на стороне клиента отправляет данные уже в кодировке желать.

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


Обновления:, основанной на ответах, и @Войну, я не думаю, что это необходимо, чтобы обнаружить что-либо, просто использовать utf8_decode должно быть достаточно (так как ваши пользователи отправляют всегда в UTF-8, и его подключения к базе всегда ждет, ISO 8859-1, независимо от кодировки, которые банк использует).

, Но если вы хотите надежное решение, вот что я предлагаю:

function fixEncoding($in_str)
{
   $cur_encoding = mb_detect_encoding($in_str) ;

   if($cur_encoding == "UTF-8" && mb_check_encoding($in_str,"UTF-8"))
   {
       return utf8_decode($in_str);
   }
   elseif($cur_encoding == "ISO 8859-1" && mb_check_encoding($in_str,"ISO 8859-1"))
   {
       return $in_str;
   }
   else
   {
       // Não testado:
       // return iconv($cur_encoding, "ISO 8859-1", $in_str);
       throw new Exception('Codificação não suportada.');
   }
}
 10
Author: mgibsonbr, 2017-05-23 12:37:27

Твой вопрос немного расплывчатым по отношению к проблеме указываю, что вы найдете, за что, здесь я оставляю некоторые факторы, которые необходимо иметь для правильной итерации с данными пользователя, данными с сервером и итерации с базой данных, начиная с основания указать, что в вашей базе данных, работает с Кодировкой UTF-8.

Примечания: Это может не ответить на твой вопрос, но мне кажется актуальным, достаточно, чтобы помочь, когда мы имеем дело с проблемы кодирования. Можно добавить гораздо больше информации. Просто укажите в комментарии необходимый.


Заявления браузеру

  • HTML-Страницы

    HTML-страниц должны всегда указание в заголовке через МЕТА-тег, charset, что браузер должен использовать для отображения и приема данных:

    , Например HTML 5

    <!doctype html>
    <html>
      <head>
        <meta charset="UTF-8">
      </head>
      ...
    

    , Например в формате HTML В 4 -

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd">
    
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      </head>
      ...
    
  • Файлы PHP

    Основной файл, отвечающий за отображение HTML и выполнять функции взаимодействия с пользователем (как правило, index.php), должен содержать указание, в начале же, до любого груза заголовки для браузера, с указанием charset:

    /* Setting charset for proper language
     * support, DB interaction, etc.
     */
    header('Content-Type: text/html; charset=UTF-8');
    

    Это будет гарантировать, что информация отправляется в браузер, и информации, полученной от же будут в UTF-8.

  • Сообщения на сервер с помощью HTML - > PHP

    Если PHP в заголовке HTML-страницы, на которых указать, в то же Кодировка, как видно сверху, один обычный post из формы на странице будет передавать информацию от браузера на сервер в кодировке UTF-8.

    Однако, есть способ указать, что форма должна отправлять данные на сервер в Charset указываю:

    <form action="mytargetfile.php" accept-charset="UTF-8">
    

    Это не является обязательным, так как процедура "нормальный" применение упомянутых в пунктах выше. Но он может быть использован без проблем.

  • Сообщения на сервер через Ajax - > PHP

    Должностей, проведенных через Ajax отправляют информация, соблюдая указания HTML-страницы. Эту же информацию должен получить целевой файл, который имеет указанием charset использовании.

    . Однако, здесь также можно указать Кодировку символов, чтобы использовать для отправки данных:

    $.ajax({
      data: parameters,
      type: "POST",
      url: ajax_url,
      contentType: "application/x-javascript; charset:UTF-8",
      success: callback
    });
    

    Указывает тип содержимого зависит, конечно, в соответствии с содержанием отправки, но не успешно, путем сообщения Charset использовании.


Уход за файлы

Editarmos или мы создадим файл, мы должны всегда иметь в виду, что то же должно остаться в кодировке Charset равна информацию, которая будет проходить через него.

Codificação do Ficheiro

Это маленькая деталь, но которая гарантирует, что информация, на котором можно хорошо управляемой по отношению к кодировке то же самое.


Итерации с Базы

Здесь важно иметь в виду, что связь, которую мы открываем в базу данных для сохранения или чтения данных необходимо использовать один и тот же Кодировка, что данные и код, отвечающий за эту операцию используют:

Пример подключения к базе данных через PDO с указанием Charset:

<?php

/**
 * Instances a new database connection
 * @return PDO instance of PDO connection
 */
protected function InitConnetion() {

  $dbh = new PDO(
    'mysql:host="meuServidor";dbname="minhaBD";',
    "utilizador",
    "password",
    array(
      PDO::ATTR_PERSISTENT               => false,
      PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
      PDO::ATTR_ERRMODE                  => PDO::ERRMODE_EXCEPTION,
      PDO::MYSQL_ATTR_INIT_COMMAND       => "SET NAMES utf8"
    )
  );

  return $dbh;
}

?>

Замечает, что я пытаюсь применить "utf8" вместо "utf-8", потому что файл базы данных имеет с инструкциями этого Charset называется utf8. В зависимости от конфигурации сервера, файл может называться "utf-8", "utf8" или "бананы". При индику имя, которое не существует, вы получите ошибку, и ты знаешь, что ты будешь иметь, что изменить.

 9
Author: Zuul, 2013-12-19 13:20:55

Лучший способ конвертировать ISO 8859-1 символ в UTF8, что я нашел, была такой: "

function fixEncoding($in_str)
{
  $cur_encoding = mb_detect_encoding($in_str) ;
  if($cur_encoding == "UTF-8" && mb_check_encoding($in_str,"UTF-8"))
    return $in_str;
  else
    return utf8_encode($in_str);
}

, Но в случае файлов HTML, просто используйте этот заголовок:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

Настоятельно Рекомендую для чтения этого статья(на английском), я нашел очень полезным для понимания encoding жизни, что в PHP иногда дают в мешок.

И в другие форматы, наиболее подходящим будет метод iconv, но должен был бы сделать некоторые тесты, чтобы попытаться заставить его динамически в отношении кодирования текущее iconv php

Источник: Здесь

 3
Author: Guerra, 2013-12-19 12:34:34

, Основанной на ответ @Войне, удалось найти решение. Моя страница html-это Кодировка UTF-8 выставиться и в моей Базе данных MySQL, а также. Что странно, потому что, когда функция обнаруживает символ в UTF-8 нужно использовать ut8_decode, что среди правильного ударения в базе.

И, насколько я понимаю utf8_decode превратится в ISO-8859-1, кто-то может дать объяснение лучше в комментариях?

  function fixEncoding($in_str)
  {
       $cur_encoding = mb_detect_encoding($in_str) ;

       if($cur_encoding == "UTF-8" && mb_check_encoding($in_str,"UTF-8"))
       {
           return utf8_decode($in_str);
       }
       else
       {
           return $in_str;
       }
  }
 1
Author: Joao Paulo, 2013-12-19 12:25:29

Программистов язык: наш кодировка UTF8!

Короче говоря, этот факт, для программистов PHP, приводит к двум видам ухода:

  1. Страниц, данных, PHP скрипты, все должно быть в кодировке UTF8. Будьте осторожны, архитектура, библиотеки, среды, вас что-то не представляющие русский в кодировке UTF-8.

  2. Следите за обновлениями в PHP, он не является "родной" UTF8", это может причинить неудобства. Чтобы преодолеть эту проблему, проверьте советов, и подробности в этом ответе.


Edit (после комментария Bacco)

- это Не вопрос "личных предпочтений", - это вопрос о, так как выполнены с плитами дорожного движения, независимые хотели бы их или нет.

Касается следующих соглашений, "де-юре" и "действительно":

 0
Author: Peter Krauss, 2020-06-11 14:45:34