Специальные символы в запросе REST - PullRequest
8 голосов
/ 09 декабря 2011

Я занимаюсь разработкой API с использованием CodeIgniter и Phils RESTserver. Я пытаюсь отправить запрос POST, содержащий специальные символы, но строка не добавляется в базу данных.

CodeIgniter также говорит, что требуется lastname (его нет в строке). Почему?

Я использую этот формат:

application/x-www-form-urlencoded

Это моя строка:

firstname=Andrew&lastname=Åsberger

Очень важно, чтобы я мог использовать специальные символы для интернационализации.

Благодарен за все комментарии!

Ответы [ 5 ]

6 голосов
/ 09 декабря 2011

Вы должны URI-кодировать каждое имя и значение. Надеемся, что код клиента и сервера согласятся с тем, что UTF-8 следует использовать для кодирования октетов символов вне диапазона US-ASCII (поскольку более ранние стандарты кодирования URI не были специфическими, и существует устаревший код, который пробует другие кодировки), поэтому ваш пример становится:

firstname=Andrew&lastname=%C3%85sberger

Точно так же, как в части запроса URI, используемого с GET.

3 голосов
/ 12 декабря 2011

Похоже, у вас проблема с кодировкой.Вы должны убедиться, что вы используете UTF8 от начала до конца: клиент (браузер), сервер (PHP), соединение БД и БД.Я предполагаю, что ваши таблицы базы данных уже UTF8, но многие забывают о подключении к базе данных.Сразу после подключения к базе данных вы должны выполнить «запрос» SET NAMES UTF8.Не уверен, что CodeIgniter использует соединение db для экранирования символов.

Я не использую CodeIgniter, но если он не использует правильную кодировку, то двухбайтовые символы расширяются до 2 символов.Например, если вы запускаете urlencode ('Å'), возвращается% C3% 85, а не% C5.На самом деле это метод SQL-инъекции.Если один из символов, который он «декодирует», является «или», значит, существует проблема / уязвимость в кавычках. Это может привести к тому, что CodeIgniter неправильно оценивает строку.

Наконец, выполняете ли вы POST через javascript? Javascript не поддерживает кодировку UTF8, поэтому он вызывает некоторые проблемы в зависимости от того, как вы POST. Вы можете использовать Javascript, чтобы POST HTML-формы, но вы можете столкнуться с проблемами, когда вы пытаетесь сделать пост Ajax, используя строки, которые вы делаете сами.unescape (encodeURIComponent (s)) предположительно работает.

2 голосов
/ 13 декабря 2011

Однажды у меня возникла похожая проблема при вставке товаров со специальными символами в имени в корзину и при создании моих URL

Не уверен, но это может быть полезно с другой точки зренияЯ также добавил my_url_helper для моего проекта для обработки URL.mb_string очень хорошо обрабатывает замены символов.Извините за мой плохой язык.:( Файл: application / config.php

/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify with a regular expression which characters are permitted
| within your URLs.  When someone tries to submit a URL with disallowed
| characters they will get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible.  By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/  

//This is not default, its modified for turkish chars
$config['permitted_uri_chars'] = 'a-üöçşığz A-ÜÖÇŞİĞZ 0-9~%.:_\-';
1 голос
/ 17 декабря 2011

Я не особо знаком с CodeIgniter; однако это:

Кажется, что Codeigniter ломает $ _POST символа '£' (фунт)

... может быть актуально. То есть проблема может быть в вашем стеке сервера, а не в вашем коде или структуре! В противном случае, вот некоторые дополнительные ссылки, которые касаются других проблемных областей w.r.t. CodeIgniter и UTF-8:

http://hash -bang.net / 2009/02 / utf8-с CodeIgniter /

http://philsturgeon.co.uk/blog/2009/08/UTF-8-support-for-CodeIgniter

Надеюсь, это поможет.

0 голосов
/ 16 декабря 2011

Это не MongoDb, так как вы не получаете то, что вам нужно от почты.

Я почти полностью уверен, что это ваши данные кодировки, не совпадающие от клиента к серверу.

Рекомендации других разработчиков по стандартизации в UTF-8 - хорошая практика, но если вы этого не хотите, просто убедитесь, что вы используете схему кодирования, которая работает с вашими символами и используется как на стороне клиента, так и на стороне сервера ,

Я не эксперт в PHP, но вы получаете нормальных символов (B) плюс специальных символов (& и%) и экранированных нормальных символов (% 26) ... но не экранированы специальные символы типа %C3%85.

Обновите дополнительную информацию о том, как вы отправляете сообщения на сервер, и я уточню подробнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...