Как обрабатывать кодировку символов в PHP - Codeigniter? - PullRequest
2 голосов
/ 22 августа 2011

Каков наилучший способ преобразования ввода пользователя в UTF-8?

У меня есть простая форма, в которой пользователь передает HTML, HTML может быть на любом языке и в любом формате кодировки символов.

Мой вопрос:

  • Можно ли представить все как UTF-8?

  • Что я могу использовать для эффективного преобразования любой кодировки символов в UTF-8, чтобы я мог проанализировать ее с помощью строковых функций PHP и сохранить ее в своей базе данных, а затем отобразить с помощью htmlentities?

Я пытаюсь решить, как лучше всего это реализовать - советы и ссылки приветствуются.

Я использую Codeigniter и его класс ввода для извлечения данных постов.

Несколько замечаний, которые я должен сделать:

  • Мне нужно преобразовать специальные символы HTML в соответствующие им объекты
  • Возможно, было бы неплохо принять кодировку и вернуть ее в той же кодировке. Тем не менее, мое веб-приложение использует:

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

Это может оказать неблагоприятное влияние на вещи.

Ответы [ 6 ]

4 голосов
/ 22 августа 2011

Укажите accept-charset в своем теге <form>, чтобы указать браузеру отправлять введенные пользователем данные в кодировке UTF-8:

<form action="foo" accept-charset="UTF-8">...</form>

Подробное руководство по см. ЗдесьИспользуйте UTF-8 во всем вашем веб-стеке .

2 голосов
/ 23 августа 2011

Можно ли представить все как UTF-8?

Да, UTF-8 - это кодировка Unicode, поэтому вы можете использовать любой символ, определенный в Unicode. Это лучшее, что вы можете сделать с компьютером на сегодняшний день.

Что я могу использовать для эффективного преобразования любой кодировки символов в UTF-8

iconv позволяет преобразовывать практически любую кодировку в любую другую кодировку. Но , для этого вы должны знать, с какой кодировкой вы имеете дело. Вы не можете сказать "iconv, что бы это ни было, сделайте это UTF-8!" . Это, к сожалению, не так, как это работает. Вы можете только сказать "iconv, у меня есть эта строка в BIG5, пожалуйста, конвертируйте ее в UTF-8." .

Если вы имеете дело только с данными формы в UTF-8, вам, вероятно, никогда не понадобится конвертировать что-либо.

чтобы я мог разобрать его с помощью строковых функций PHP

«Строковые функции PHP» работают с байтами. Они не заботятся о символах или кодировках. В зависимости от того, что вы хотите сделать, работа с наивными строковыми функциями PHP над текстом UTF-8 даст вам плохие результаты. Используйте строковые функции с поддержкой кодирования в расширении МБ для любых операций с многобайтовыми строками кодирования.

сохранить в моей базе данных

Просто убедитесь, что ваша база данных хранит текст в UTF-8, и вы установили соединение с базой данных на UTF-8 (то есть база данных знает, что вы отправляете ей данные UTF-8). Вы должны указать это в настройках соединения с базой данных CodeIgniter.

впоследствии эхо, используя htmlentities?

Просто echo htmlentities($text), больше ничего вам не нужно делать.

Однако мое веб-приложение использует: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Это может оказать неблагоприятное влияние на вещи.

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

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

1 голос
/ 22 августа 2011

1) Можно ли представить все как UTF-8?

Да, все определено в UNICODE.Это максимум, что вы можете получить в настоящее время, и есть место для будущего, которое может поддерживать UNICODE.

2) Что я могу использовать для эффективного преобразования любой кодировки символов в UTF-8, чтобы я мог разобратьэто с помощью строковых функций PHP и сохранения его в моей базе данных и последующего вывода с использованием htmlentities?

Единственное, что вам нужно знать, это фактическая кодировка ваших данных.Если вы хотите, чтобы ваше веб-приложение поддерживало UTF-8 для ввода и вывода, клиент должен сообщить, что поддерживает UTF-8.См. Кодировки символов для руководства по пользовательскому интерфейсу ваших приложений.

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

Связанный:

  1. Подготовка приложения PHP для использования с UTF-8
  2. Как обнаружитьнеправильно сформированная строка utf-8 в PHP?
0 голосов
/ 26 мая 2013

Я обнаружил, что единственное, что работает для кодировки UTF-8, это установка внутри моего config.php

putenv('LC_ALL=en_US.utf8'); // or whatever language you need
setlocale(LC_ALL, 'en_US.utf8');  // or whatever language you need
bindtextdomain("mydomain", dirname(__FILE__) . "/../language");
textdomain("mydomain");
0 голосов
/ 23 августа 2011

РЕДАКТИРОВАТЬ:

Is it possible to represent everything as UTF-8?

Да, вот что вам нужно для обеспечения:

  • html: заголовки / мета-заголовки установлены в utf-8
  • все файлы сохранены как utf-8
  • сопоставление базы данных, таблицы и кодирование данных в utf-8

What can I use to effectively convert any character encoding to UTF-8

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

// eg
$name = utf8_encode($this->input->post('name'));

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

// Make sure have these lines
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
0 голосов
/ 22 августа 2011

Если вы хотите изменить кодировку строки, вы можете попробовать

$utf8_string = mb_convert_encoding( $yourBadString , 'UTF-8' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...