Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 04.02.2014
Сообщений: 14

Вывод строки c html-сущностями и кавычками

04.02.2017, 10:51. Показов 3483. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день друзья.

Если мне нужно вывести строку из БД на экран, то делаю это так:

PHP
1
2
$str="ЭЭ олвыдоа  \"fdsf\" \' fdsfsdf\'";
echo(htmlspecialchars($str, ENT_QUOTES,'cp1251'));
это работает очень хорошо, но если строка $str содержит html-сущности, то начинаются проблемы:

PHP
1
2
$str="哪 ЭЭ олвыдоа  \"fdsf\" \' fdsfsdf\'";
echo(htmlspecialchars($str, ENT_QUOTES,'cp1251'));
& преобразуется в & и ломает вывод сущности 哪 превращая ее в 哪

Как грамотно поступать в таких случаях?
Спасибо
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.02.2017, 10:51
Ответы с готовыми решениями:

Разработать функцию, выполняющую кодирование специальных символов строки text соответствующими сущностями HTML
Помогите пожалуйста с задачей) Разработайте функцию std::string HtmlEncode(std::string const& text), выполняющую кодирование...

Преобразование xml в html с использованием языка XLST с сущностями DOCTYPE
Здравствуйте. Я написал код для преобразования xml в html, используя язык стилей xlst. Все работает отлично, но если в файле со стилями...

Проблема с кавычками и html-тегами
Начинающий. Разбираюсь с XML по книге Beginning XML 4th Edition, авторы David Hunter и Ко. Возьмем пример: <?xml...

14
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
04.02.2017, 10:57
hwmaster, htmlentities.
0
0 / 0 / 0
Регистрация: 04.02.2014
Сообщений: 14
04.02.2017, 12:31  [ТС]
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
hwmaster, htmlentities.
И что ?? htmlentities точно так же переводят 哪 в 哪

Во втором примере строка выглядит так:
$str="&_#21738; ЭЭ олвыдоа "fdsf" \' fdsfsdf\'"; пришлось в html сущность вставить знак _ иначе показывался сам иероглиф 哪
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
04.02.2017, 12:39
Цитата Сообщение от hwmaster Посмотреть сообщение
И что ??
Ничего, попробуйте добавить один из флагов: ENT_SUBSTITUE или ENT_DISALLOWED.
0
0 / 0 / 0
Регистрация: 04.02.2014
Сообщений: 14
04.02.2017, 13:35  [ТС]
ENT_SUBSTITUTE Заменяет некорректные кодовые последовательности символом замены Юникода U+FFFD в случае использования UTF-8 и &#FFFD; при использовании другой кодировки, вместо возврата пустой строки.

ENT_DISALLOWED Заменяет неверные коды символов для заданного типа документа символом замены юникода U+FFFD (UTF-8) или &#FFFD; (при использовании другой кодировки) вместо того, чтобы оставлять все как есть. Это может быть полезно, например, для того, чтобы убедиться в формальной правильности XML-документов со встроенным внешним контентом.


Это тут не причем. Похоже вы не поняли проблемы. Попробую объснить получше:

Сайт на windows-1251
в форме набирают:
请问,厕所在哪 - "иероглифы & сущности"
на сервер через POST приходит:
&_#35831;&_#38382;&_#65292;&_#21397;&_#2 5152;&_#22312;&_#21738; - "иероглифы & сущности"
знак _ вставил я, чтобы показать коды сущностей.
эту самую строку, где иероглифы представлены, как html сущности помещаем в БД в кодировке windows-1251.
далее нужно вывести эту строку на странице сайта
сделать просто echo нельзя, нужно сначала сделать htmlspecialchars(), как это обычно делается.
Но при этом портятся коды сущностей, потому как из &_#35831; получаем 请 и вместо иероглифов мы видим коды сущностей.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
04.02.2017, 14:05
Цитата Сообщение от hwmaster Посмотреть сообщение
сделать просто echo нельзя, нужно сначала сделать htmlspecialchars(), как это обычно делается.
Не нужно. Данные к вам приходят уже в виде сущностей. В повторном преобразовании смысла нет.

Если так хотите преобразовывать на выходе - тогда сначала преобразовывайте сущности в спецсимволы и в таком виде сохраняйте в БД.
0
0 / 0 / 0
Регистрация: 04.02.2014
Сообщений: 14
04.02.2017, 16:22  [ТС]
Добавлено через 5 минут
Цитата Сообщение от Jodah Посмотреть сообщение
преобразовывайте сущности в спецсимволы
Я бы мог это сделать, но БД в ср1251
Похоже простого решения нет. Придется переписать htmlspecialchars() под свои нужды, т.е. костыль сделать.
Что-то типа: взять строку, пройтись по ней, если встретили сущность, то не трогать, если просто &, то сделать из него сущность &. Регулярки придется использовать или можно побыстрее как-то?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
04.02.2017, 17:01
hwmaster, я бы базу на utf8 перевёл, зачем лишние проблемы?
0
0 / 0 / 0
Регистрация: 04.02.2014
Сообщений: 14
04.02.2017, 23:45  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
я бы базу на utf8 перевёл, зачем лишние проблемы?
перевод сайта на utf-8 решит все проблемы, это я понимаю.
Но сайт специально пишется на cp1251 с целью оптимизации нагрузки на сервер при большом количестве запросов.
Сайт будет работать только в России. Но нужна поддержка редких utf-8 символов.
В данном случае не вижу смысла работать с utf-8 просто по тому что так все делают.
осталось только понять, как сделать правильно в данном случае, чтобы было быстро и оптимально.

Добавлено через 4 часа 3 минуты
Еще вот вопрос родился. Для чего в htmlspecialchars обрабатывается символ &.
Он каким образом влияет на вывод строки на экран?
кавычки и угловые скобки - понятно, а с & что не так?
Спасибо.

Добавлено через 1 час 11 минут
вот такое решение родилось:

PHP
1
2
3
function hsc($in_str){
    return preg_replace('/&(#\d+;)/','&$1',htmlspecialchars($in_str, ENT_QUOTES,'cp1251'));
}
после преобразования htmlspecialchars() с помощью регулярки вырезаем лишние amp; из сущностей. Все просто.
оно конечно не действует на символьные сущности. Но похоже, что из формы на сервер отправляются только числовые.
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,229
05.02.2017, 06:48
Цитата Сообщение от hwmaster Посмотреть сообщение
Но сайт специально пишется на cp1251 с целью оптимизации нагрузки на сервер при большом количестве запросов.
Сайт будет работать только в России. Но нужна поддержка редких utf-8 символов.
В данном случае не вижу смысла работать с utf-8 просто по тому что так все делают.
увидите. Через 59 грабель в лицо всё-равно будете сидеть на utf-8.
"специально" писать на cp1251 это серьёзная клиника
не менее серьёзная клиника изначально надеяться на "большое кол-во запросов" при таком уровне знаний
сколько было слито бюджетов на "крутые сервера" в погоне за такими целями, а в итоге всё выливалось в использование 1-2% мощностей

Цитата Сообщение от hwmaster Посмотреть сообщение
после преобразования htmlspecialchars() с помощью регулярки вырезаем лишние amp; из сущностей. Все просто.
это вообще прелесть
очень способствует "сокращению нагрузок"
 Комментарий модератора 
Уважительно относитесь к участникам форума!
0
0 / 0 / 0
Регистрация: 04.02.2014
Сообщений: 14
05.02.2017, 08:17  [ТС]
Цитата Сообщение от полудух Посмотреть сообщение
"специально" писать на cp1251 это серьёзная клиника
Тут вы ошибаетесь. Приведите хотябы один довод в пользу utf-8 для русскоязычного сайта.
Цитата Сообщение от полудух Посмотреть сообщение
очень способствует "сокращению нагрузок"
Вы правы, строку нужно обработать один раз при вводе, а не каждый раз при выводе, поэтому конвертация знака & будет проводиться при вводе данных в БД. А htmlspecialchars() перепишется, чтобы не влияла на знак & и все.
Других грабель я не вижу, может подскажете.

Кстати, чтоб вы знали - уровень знаний, никак не влияет на посещаемость сайта.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
05.02.2017, 10:08
Цитата Сообщение от hwmaster Посмотреть сообщение
пишется на cp1251 с целью оптимизации нагрузки на сервер
Это псевдооптимизация. Есть десятки гораздо более эффективных способов. Для уменьшения трафика можно использовать gzip, в этом случае разница между utf8 и cp1251 будет всего ~20%.

Цитата Сообщение от hwmaster Посмотреть сообщение
Приведите хотябы один довод в пользу utf-8 для русскоязычного сайта.
Плюс один - удобство. Вы уже столкнулись с необходимостью писать костыль. Если решите использовать AJAX (отправка запросов на сервер без перезагрузки страницы) - придётся писать ещё один, потому что по-умолчанию ajax-запросы отправляются в utf8.
0
0 / 0 / 0
Регистрация: 04.02.2014
Сообщений: 14
05.02.2017, 11:05  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
в этом случае разница между utf8 и cp1251 будет всего ~20%.
Еще БД в 2 раза больше в utf-8. Запросы к ней в 2 раза дольше выполняются. Поиск по БД полнотекстовый в разы дольше в UTF-8. Это тоже аргументы.
Цитата Сообщение от Jodah Посмотреть сообщение
ajax-запросы отправляются в utf8.
С этим понятно, все работает.

На всем интернет пространстве кричат, что utf-8 это наше все. Но складывается ощущение, что все преимущества utf-8 в том что с ним удобней работать программисту. Соглашусь, что, если программист не умеет работать с cp1251, то вместо того чтобы понять, как с этим работать он лучше будет отстаивать utf-8. Но получается, что сайт пишется только один раз, упрощая себе жизнь с utf-8 программист обрекает всех на дальнейшие постоянные удвоенные нагрузки на сервера и трафик. Это же не нормально.
Я ведь не спорю. Так можно вообще скатиться до того, чтобы писать сайты на ассемблере. Вот где скорость то будет!
Просто все голословно кричат utf-8 и ничто другое!
В идеале было бы посмотреть на статистику нагрузки на сайт до перехода на Utf-8 и после. Вот это можно было бы рассматривать, как аргумент. Но я не нашел таких сравнений. Может подскажете, где искать?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
05.02.2017, 12:04
Лучший ответ Сообщение было отмечено hwmaster как решение

Решение

Цитата Сообщение от hwmaster Посмотреть сообщение
преимущества utf-8 в том что с ним удобней работать программисту
Преимущество в том, что вы можете работать с разными языками. Вы делаете упор на то, что сайт русскоязычный, однако собираетесь использовать иероглифы. Значит, сайт мультиязычный, просто предназначен для российской аудитории.

Для мультиязычных сайтов есть своя кодировка, вот и всё.

Цитата Сообщение от hwmaster Посмотреть сообщение
упрощая себе жизнь с utf-8 программист обрекает всех на дальнейшие постоянные удвоенные нагрузки на сервера и трафик.
Что касается трафика, я писал выше, что разницу можно значительно сократить.

Касательно нагрузок - спорно. Вы ведь собираетесь использовать спецсимволы и ради этого делаете костыли. Значит тестировать надо utf8 против cp1251 + ваши костыли.
0
0 / 0 / 0
Регистрация: 04.02.2014
Сообщений: 14
05.02.2017, 13:27  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
Значит тестировать надо utf8 против cp1251 + ваши костыли.
Да, вот оно !!! Именно это и заставляет меня задавать вопросы. Что в итоге будет лучше, быстрей, удобней и стабильней. В общем, а не по отдельности.
Сущности так или иначе придется обрабатывать, а это уже не один байт и теряется вся прелесть однобайтной кодировки.
Вобщем стоит еще подумать о переходе на utf-8.

Может у кого есть ссылки на примеры о результатах перехода на utf-8. Насколько увеличивается нагрузка на сервера. Про трафик, понятно примем увеличение на 25%, как терпимое.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.02.2017, 13:27
Помогаю со студенческими работами здесь

Связи между сущностями, вывод таблиц, Derby
Здравствуйте. У меня тут при "ознакомлении" с Derby в NetBeans возникла проблема. Создала 4 таблицы. Теперь не знаю, как вывести на...

Вывод текста с кавычками текстого поля
Надо вывести текстовое поле. Проблема в том, что там может содержатся 'какое-то_название' в кавычках и начиная с кавычек текст обрубается....

Сплит строки с ',' и кавычками
Есть строка такого формата: "abcd","abbc","AAA ""BB""",123,14,"ss, "sdd"",4444 Нужно рассплитить по ',' но так, чтобы сплит не...

Удаление слова с кавычками из строки.
Ребят я начинающий, помогите мне написать программу на СИ, где имеется строка в которой находится слово в кавычках, требуется удалить слово...

Выделить подстроку с кавычками из строки QString
Как выделить подстроку из длинной строки QString, если в ней есть символы < и "". То есть, строка к примеру следующая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru