php строка с переменными

PHP: Строки

Значениями типа string являются текстовые строки (кратко строки). Строка — это последовательность из нуля или более символов. Символы включают в себя буквы, цифры, знаки пунктуации, специальные символы и пробелы.

Строка может быть определена четырьмя различными способами:

Строка в двойных кавычках

Строка в двойных кавычках:

В строках с двойными кавычками можно использовать управляющие последовательности. Управляющая последовательность — это специальные символы предназначенные для форматирования текстового вывода. В PHP доступны следующие управляющие последовательности:

ПоследовательностьЗначение
\nПеревод на новую строку (шестнадцатеричный код 0A).
\tГоризонтальная табуляция (шестнадцатеричный код 09).
\\Обратная косая черта (обратный слэш).
\$Знак доллара.
Двойная кавычка.
\xXXСимвол, заданный одной или двумя шестнадцатеричными цифрами.

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

Строки, заключённые в двойные кавычки, могут содержать символы одинарных кавычек:

Строка в одинарных кавычках (апострофах)

Строка в одинарных кавычках:

В отличие от строк в двойных кавычках и heredoc-синтаксиса, переменные и управляющие последовательности (за одним исключением), заключённые в одинарные кавычки, не обрабатываются. Это означает, что они будут интерпретированы как обычные символы строки:

Чтобы в строке, заключённой в одинарные кавычки, можно было использовать одинарные кавычки, нужно их экранировать с помощью обратного слэша ( \’ ). Если необходимо написать саму обратную косую черту, нужно продублировать её ( \\ ):

Строки, заключённые в одинарные кавычки, могут содержать символы двойных кавычек:

Heredoc-синтаксис

Heredoc-синтаксис — это альтернативный способ записи строк.

Строка, определяемая с помощью Heredoc-синтаксиса, работает также, как и строка, расположенная в двойных кавычках. Разница между Heredoc и строкой в двойных кавычках заключается в том, что используя Heredoc нет необходимости экранировать двойные кавычки.

Nowdoc-синтаксис

Nowdoc-синтаксис также как и Heredoc является альтернативным способом записи строк.

Строка, определяемая с помощью Nowdoc-синтаксиса, работает также, как и строка, расположенная в одинарных кавычках. Разница между Nowdoc и строкой в одинарных кавычках заключается в том, что используя Nowdoc нет необходимости экранировать одинарные кавычки.

Синтаксис Nowdoc похож на Heredoc с той лишь разницей, что открывающий идентификатор обязательно должен быть заключён в одинарные кавычки:

Обработка переменных в строках

Существует два типа синтаксиса обработки переменных в строках: простой и сложный.

Простой синтаксис — это когда имя переменной указывается в строке как есть.

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

Сложный синтаксис — это когда имя переменной заключается в фигурные скобки.

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

Чтобы явно указать интерпретатору, где оканчивается имя переменной требуется заключить имя переменной в фигурные скобки:

Знак доллара может быть расположен как перед фигурной скобкой, так и после неё:

Конкатенация

Значение любого типа, которое объединяется со строкой, будет неявно преобразовано в строку и далее будет произведена конкатенация:

Источник

Строки

Замечание: Нет никаких проблем, если строка очень велика. Практически не существует ограничений на размер строк, налагаемых PHP, так что нет абсолютно никаких причин беспокоиться об их длине.

Синтаксис

Одинарные кавычки

Чтобы использовать одинарную кавычку внутри строки, как и во многих других языках, ее необходимо предварить символом обратной косой черты (\), т. е. экранировать ее. Если обратная косая черта должна идти перед одинарной кавычкой либо быть в конце строки, вам необходимо продублировать ее. Обратите внимание, что если вы попытаетесь экранировать любой другой символ, обратная косая черта также будет напечатана! Так что, как правило, нет необходимости экранировать саму обратную косую черту.

Замечание: В PHP 3 в данном случае будет выдано сообщение уровня E_NOTICE.

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

Двойные кавычки

Если строка заключена в двойные кавычки («), PHP распознает большее количество управляющих последовательностей для специальных символов:

Таблица 11-1. Управляющие последовательности

последовательностьзначение
\nновая строка (LF или 0x0A (10) в ASCII)
\rвозврат каретки (CR или 0x0D (13) в ASCII)
\tгоризонтальная табуляция (HT или 0x09 (9) в ASCII)
\\обратная косая черта
\$знак доллара
двойная кавычка
\2

последовательность символов, соответствующая регулярному выражению, символ в восьмеричной системе счисления
\x[0-9A-Fa-f]

последовательность символов, соответствующая регулярному выражению, символ в шестнадцатеричной системе счисления

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

Но самым важным свойством строк в двойных кавычках является обработка переменных. Смотрите более подробно: обработка строк.

Heredoc

Источник

PHP-конкатенация или прямая вставка переменных в строку

мне интересно, каков правильный способ вставки переменных PHP в строку?

таким образом:

или так:

11 ответов

между этими двумя синтаксисами, вы действительно должны выбрать тот, который вы предпочитаете 🙂

лично я бы пошел с вашим вторым решением в таком случае (переменной интерполяции), который мне легче писать и читать.

Как sidenote, поэтому мой ответ немного более полный: день, который вы захотите сделать что-то вроде этого:—7—>

в этот день, вам нужно использовать <> :

нет необходимости использовать конкатенации.

Также обратите внимание, что ваш первый синтаксис:

может быть оптимизация, избегая конкатенации, используя:

(но, как я уже сказал раньше это не имело большого значения. )

строки с двойными кавычками более элегантны, потому что вам не нужно разбивать строку каждый раз, когда вам нужно вставить переменную (как вы должны делать с строками с одиночными кавычками).

однако, если вам нужно вставить возвращаемое значение функции, это не может быть вставлено в строку с двойными кавычками-даже если вы окружаете ее фигурными скобками!

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

С точки зрения создания мыслей простой, читабельный, последовательный и легко понять (поскольку производительность здесь не имеет значения):

использование встроенных vars в двойных кавычках может привести к сложным и запутанным ситуациям, когда вы хотите внедрить свойства объекта, многозначные массивы и т. д. То есть, как правило, при чтении встроенных vars вы не можете быть мгновенно на 100% уверены в окончательном поведение того, что Вы читаете.

AFAIK, вы не можете вставлять константы.

В некоторых конкретные случаи, «двойные кавычки с встраиванием vars» могут быть полезны, но вообще говоря, я бы пошел на объединение (используя одинарные или двойные кавычки, когда удобно)

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

начиная с php4 вы можете использовать форматер строк:

пойти с первым и использовать одинарные кавычки!

вы также должны проверить PHP конкатенация переменных, phpbench.com для некоторых критериев по различным методам работы.

Это только вопрос вкуса.
Используйте все, что пожелаете.

большую часть времени я использую второй, но это зависит.

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

не сцепить. Это не нужно, запятые США, поскольку echo может принимать несколько параметров

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

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

Если переменная внутри двойной кавычки PHP требует времени для разбора переменной.

Я не понимаю, почему этот ответ в приведенной выше ссылке Получить upvoted и почему этот ответ получил downvote.

Как я сказал то же самое.

вы также можете посмотреть здесь

я знаю, что это старый вопрос, но я думаю, что кто-то должен упомянуть все плюсы и минусы:

Лучше Синтаксис: это личное предпочтение.

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

читабельности: нет разницы (может применяться личное предпочтение).

Права На Запись/Восстановление Права На Запись/Отладки: в 1-строчных операторах нет разницы, но при работе с несколькими строками легче комментировать / раскомментировать строки во время отладки или записи. Для пример:

Меньше Изменений: одинарная кавычка. Например, если у вас есть следующий код:

но для двойной цитаты вам нужно будет изменить это:

вывод: использовать то, что вы предпочитаете.

Источник

Функции для работы со строками

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

Содержание

User Contributed Notes 24 notes

In response to hackajar yahoo com,

No string-to-array function exists because it is not needed. If you reference a string with an offset like you do with an array, the character at that offset will be return. This is documented in section III.11’s «Strings» article under the «String access and modification by character» heading.

I’m converting 30 year old code and needed a string TAB function:

//tab function similar to TAB used in old BASIC languages
//though some of them did not truncate if the string were
//longer than the requested position
function tab($instring=»»,$topos=0) <
if(strlen($instring)

I use these little doo-dads quite a bit. I just thought I’d share them and maybe save someone a little time. No biggy. 🙂

Just a note in regards to bloopletech a few posts down:

The word «and» should not be used when converting numbers to text. «And» (at least in US English) should only be used to indicate the decimal place.

Example:
1,796,706 => one million, seven hundred ninety-six thousand, seven hundred six.
594,359.34 => five hundred ninety four thousand, three hundred fifty nine and thirty four hundredths

/*
* example
* accept only alphanum caracteres from the GET/POST parameters ‘a’
*/

to: james dot d dot baker at gmail dot com

PHP has a builtin function for doing what your function does,

/**
Utility class: static methods for cleaning & escaping untrusted (i.e.
user-supplied) strings.

Any string can (usually) be thought of as being in one of these ‘modes’:

pure = what the user actually typed / what you want to see on the page /
what is actually stored in the DB
gpc = incoming GET, POST or COOKIE data
sql = escaped for passing safely to RDBMS via SQL (also, data from DB
queries and file reads if you have magic_quotes_runtime on—which
is rare)
html = safe for html display (htmlentities applied)

Always knowing what mode your string is in—using these methods to
convert between modes—will prevent SQL injection and cross-site scripting.

This class refers to its own namespace (so it can work in PHP 4—there is no
self keyword until PHP 5). Do not change the name of the class w/o changing
all the internal references.

Example usage: a POST value that you want to query with:
$username = Str::gpc2sql($_POST[‘username’]);
*/

Example: Give me everything up to the fourth occurance of ‘/’.

//
// string strtrmvistl( string str, [int maxlen = 64],
// [bool right_justify = false],
// [string delimter = «
\n»])
//
// splits a long string into two chunks (a start and an end chunk)
// of a given maximum length and seperates them by a given delimeter.
// a second chunk can be right-justified within maxlen.
// may be used to ‘spread’ a string over two lines.
//

I really searched for a function that would do this as I’ve seen it in other languages but I couldn’t find it here. This is particularily useful when combined with substr() to take the first part of a string up to a certain point.

?>

Example: Give me everything up to the fourth occurance of ‘/’.

The functions below:

Are correct, but flawed. You’d need to use the === operator instead:

Here’s an easier way to find nth.

I was looking for a function to find the common substring in 2 different strings. I tried both the mb_string_intersect and string_intersect functions listed here but didn’t work for me. I found the algorithm at http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Longest_common_substring#PHP so here I post you the function

Here’s a simpler «simplest» way to toggle through a set of 1..n colors for web backgrounds:

If you want a function to return all text in a string up to the Nth occurrence of a substring, try the below function.

(Pommef provided another sample function for this purpose below, but I believe it is incorrect.)

/*
// prints:
S: d24jkdslgjldk2424jgklsjg24jskgldjk24
1: d
2: d24jkdslgjldk
3: d24jkdslgjldk24
4: d24jkdslgjldk2424jgklsjg
5: d24jkdslgjldk2424jgklsjg24jskgldjk
6: d24jkdslgjldk2424jgklsjg24jskgldjk24
7: d24jkdslgjldk2424jgklsjg24jskgldjk24
*/

?>

Note that this function can be combined with wordwrap() to accomplish a routine but fairly difficult web design goal, namely, limiting inline HTML text to a certain number of lines. wordwrap() can break your string using
, and then you can use this function to only return text up to the N’th
.

You will still have to make a conservative guess of the max number of characters per line with wordwrap(), but you can be more precise than if you were simply truncating a multiple-line string with substr().

= ‘Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque id massa. Duis sollicitudin ipsum vel diam. Aliquam pulvinar sagittis felis. Nullam hendrerit semper elit. Donec convallis mollis risus. Cras blandit mollis turpis. Vivamus facilisis, sapien at tincidunt accumsan, arcu dolor suscipit sem, tristique convallis ante ante id diam. Curabitur mollis, lacus vel gravida accumsan, enim quam condimentum est, vitae rutrum neque magna ac enim.’ ;

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque id massa. Duis sollicitudin
ipsum vel diam. Aliquam pulvinar sagittis felis. Nullam hendrerit semper elit. Donec convallis
mollis risus. Cras blandit mollis turpis. Vivamus facilisis, sapien at tincidunt accumsan, arcu

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque id massa. Duis sollicitudin
ipsum vel diam. Aliquam pulvinar sagittis felis. Nullam hendrerit semper elit. Donec convallis
mollis risus. Cras blandit mollis turpis. Vivamus facilisis, sapien at tincidunt accumsan, arcu
dolor suscipit sem, tristique convallis ante ante id diam. Curabitur mollis, lacus vel gravida

Источник

Строки

Замечание: Строки ( string ) не могут быть размером более 2 Гб (2147483647 байт).

Синтаксис

Строка может быть определена четырьмя различными способами:

Одинарные кавычки

Чтобы использовать одинарную кавычку внутри строки, проэкранируйте ее обратной косой чертой (\). Если необходимо написать саму обратную косую черту, продублируйте ее (\\). Все остальные случаи применения обратной косой черты будут интерпретированы как обычные символы: это означает, что если вы попытаетесь использовать другие управляющие последовательности, такие как \r или \n, они будут выведены как есть вместо какого-либо особого поведения.

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

echo ‘это простая строка’ ;

echo ‘Также вы можете вставлять в строки
символ новой строки вот так,
это нормально’ ;

// Выводит: Однажды Арнольд сказал: «I’ll be back»
echo ‘Однажды Арнольд сказал: «I\’ll be back»‘ ;

// Выводит: Вы удалили C:\*.*?
echo ‘Вы удалили C:\\*.*?’ ;

// Выводит: Вы удалили C:\*.*?
echo ‘Вы удалили C:\*.*?’ ;

// Выводит: Это не будет развернуто: \n новая строка
echo ‘Это не будет развернуто: \n новая строка’ ;

Двойные кавычки

Если строка заключена в двойные кавычки («), PHP распознает большее количество управляющих последовательностей для специальных символов:

Управляющие последовательности

ПоследовательностьЗначение
\nновая строка (LF или 0x0A (10) в ASCII)
\rвозврат каретки (CR или 0x0D (13) в ASCII)
\tгоризонтальная табуляция (HT или 0x09 (9) в ASCII)
\vвертикальная табуляция (VT или 0x0B (11) в ASCII) (с версии PHP 5.2.5)
\eescape-знак (ESC или 0x1B (27) в ASCII) (с версии PHP 5.4.4)
\fподача страницы (FF или 0x0C (12) в ASCII) (с версии PHP 5.2.5)
\\обратная косая черта
\$знак доллара
двойная кавычка
\3последовательность символов, соответствующая регулярному выражению символа в восьмеричной системе счисления
\x[0-9A-Fa-f]последовательность символов, соответствующая регулярному выражению символа в шестнадцатеричной системе счисления

Как и в строке, заключенной в одинарные кавычки, экранирование любого символа выведет также и саму обратную косую черту. До версии PHP 5.1.1, обратная косая черта в \ не печаталась.

Но самым важным свойством строк в двойных кавычках является обработка переменных. Смотрите более подробно: обработка строк

Heredoc

Очень важно отметить, что строка с закрывающим идентификатором не должна содержать других символов, за исключением точки с запятой (;). Это означает, что идентификатор не должен вводиться с отступом и что не может быть никаких пробелов или знаков табуляции до или после точки с запятой. Важно также понимать, что первым символом перед закрывающим идентификатором должен быть символ новой строки, определенный в вашей операционной системе. Например, в UNIX системах, включая Mac OS X, это \n. После закрывающего идентификатора также сразу должна начинаться новая строка.

Если это правило нарушено и закрывающий идентификатор не является «чистым», считается, что закрывающий идентификатор отсутствует и PHP продолжит его поиск дальше. Если в этом случае верный закрывающий идентификатор так и не будет найден, то это вызовет ошибку парсинга с номером строки в конце скрипта.

Heredoc не может быть использован для инициализации полей класса. Начиная с версии PHP 5.3, это ограничение распространяется только на heredoc, содержащие внутри себя переменные.

Пример #1 Неверный пример

Heredoc-текст ведет себя так же, как и строка в двойных кавычках, при этом их не имея. Это означает, что вам нет необходимости экранировать кавычки в heredoc, но вы по-прежнему можете использовать вышеперечисленные управляющие последовательности. Переменные обрабатываются, но с применением сложных переменных внутри heredoc нужно быть также внимательным, как и при работе со строками.

Пример #2 Пример определения heredoc-строки

= Пример строки,
охватывающей несколько строчек,
с использованием heredoc-синтаксиса.
EOD;

$foo = new foo ();
$name = ‘МоеИмя’ ;

Результат выполнения данного примера:

Также возможно использовать heredoc-синтаксис для передачи данных через аргументы функции:

Пример #3 Пример применения heredoc в аргументах

Начиная с версии 5.3.0, стала возможной инциализация статических переменных и свойств/констант класса с помощью синтаксиса heredoc:

Пример #4 Использование heredoc для инциализации статических переменных

// Class properties/constants
class foo
<
const BAR = Пример использования константы
FOOBAR;

Начиная с версии PHP 5.3.0 можно также окружать идентификатор Heredoc двойными кавычками:

Пример #5 Использование двойных кавычек в heredoc

Nowdoc

Nowdoc указывается той же последовательностью = Пример текста,
занимающего несколько строк,
с помощью синтаксиса nowdoc.
EOD;

$foo = new foo ();
$name = ‘МоеИмя’ ;

Результат выполнения данного примера:

В отличие от heredoc, nowdoc может быть использован в любом контексте со статическими данными. Типичный пример инициализации полей класса или констант:

Пример #7 Пример использования статичных данных

Поддержка nowdoc была добавлена в PHP 5.3.0.

Обработка переменных

Если строка указывается в двойных кавычках, либо при помощи heredoc, переменные внутри нее обрабатываются.

Существует два типа синтаксиса: простой и сложный. Простой синтаксис более легок и удобен. Он дает возможность обработки переменной, значения массива ( array ) или свойства объекта ( object ) с минимумом усилий.

Сложный синтаксис может быть определен по фигурным скобкам, окружающим выражение.

Простой синтаксис

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

Результат выполнения данного примера:

Аналогично могут быть обработаны элемент массива ( array ) или свойство объекта ( object ). В индексах массива закрывающая квадратная скобка (]) обозначает конец определения индекса. Для свойств объекта применяются те же правила, что и для простых переменных.

Пример #8 Пример простого синтаксиса

$people = new people ();

Результат выполнения данного примера:

Для чего-либо более сложного, используйте сложный синтаксис.

Сложный (фигурный) синтаксис

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

Любая скалярная переменная, элемент массива или свойство объекта, отображаемое в строку, может быть представлена в строке этим синтаксисом. Просто запишите выражение так же, как и вне строки, а затем заключите его в <и >. Поскольку <не может быть экранирован, этот синтаксис будет распознаваться только когда $ следует непосредственно за <. Используйте <\$, чтобы напечатать <$. Несколько поясняющих примеров:

// Показываем все ошибки
error_reporting ( E_ALL );

echo «Это значение переменной по имени, которое возвращает функция getName(): <$< getName ()>> » ;

// Не работает, выводит: Это то, что возвращает getName():
echo «Это то, что возвращает getName(): » ;
?>

С помощью этого синтаксиса также возможен доступ к свойствам объекта внутри строк.

Результат выполнения данного примера:

Функции, вызовы методов, статические переменные классов, а также константы классов работает внутри , начиная с версии PHP 5. Однако, указываемое значение будет обработано как имя переменной в том же контексте, что и строка, в которой она определяется. Использование одинарных фигурных скобок (<>) не будет работать для доступа к значениям функций, методов, констант классов или статических переменных класса.

// Показываем все ошибки
error_reporting ( E_ALL );

$rootbeer = ‘A & W’ ;
$ipa = ‘Alexander Keith\’s’ ;

Доступ к символу в строке и его изменение

Строки в PHP внутренне представляют из себя массивы байт. Как результат, доступ или изменение строки по смещению небезопасно с точки зрения многобайтной кодировки, и должно выполняться только со строками в однобайтных кодировках, таких как, например, ISO-8859-1.

Пример #9 Несколько примеров строк

Начиная с PHP 5.4 смещение в строке должно задаваться либо целым числом либо строкой, содержащей цифры, иначе будет выдаваться предупреждение. Ранее смещение, заданное строкой вида «foo», без предупреждений преобразовывалось в 0.

Пример #10 Различия между PHP 5.3 и PHP 5.4

Результат выполнения данного примера в PHP 5.3:

Результат выполнения данного примера в PHP 5.4:

В PHP 5.5 была добавлена поддержка доступа к символам в строковых литералах с помощью синтаксиса [] или <>.

Полезные функции и операторы

Строки могут быть объединены при помощи оператора ‘.’ (точка). Обратите внимание, оператор сложения ‘+’ здесь не работает. Дополнительную информацию смотрите в разделе Строковые операторы.

Для модификации строк существует множество полезных функций.

Также существуют функции для работы с URL, и функции шифрования/дешифрования строк (mcrypt и mhash).

Преобразование в строку

Целое ( integer ) или число с плавающей точкой ( float ) преобразуется в строку, представленную числом, состоящим из его цифр (включая показатель степени для чисел с плавающей точкой). Числа с плавающей точкой могут быть преобразованы с помощью экспоненциального представления (4.1E+6).

NULL всегда преобразуется в пустую строку.

Преобразование строк в числа

Если строка распознается как числовое значение, результирующее значение и тип определяется так, как показано далее.

Если строка не содержит какой-либо из символов ‘.’, ‘e’, или ‘E’, и значение числа помещается в пределы целых чисел (определенных PHP_INT_MAX ), строка будет распознана как целое число ( integer ). Во всех остальных случаях она считается числом с плавающей точкой ( float ).

Более подробную информацию об этом преобразовании смотрите в разделе о strtod(3) документации Unix.

Если вы хотите протестировать любой из примеров этого раздела, скопируйте и вставьте его и следующую строку, чтобы увидеть, что происходит:

Подробности реализации строкового типа

Строковый тип ( string ) в PHP реализован в виде массива байт и целого числа, содержащего длину буфера. Он не содержит никакой информации о способе преобразования этих байт в символы, предоставляя эту задачу программисту. Нет никаких ограничений на содержимое строки, например, байт со значением 0 («NUL»-байт) может располагаться где угодно (однако, стоит учитывать, что некоторые функции, как сказано в этом руководстве, не являются «бинарно-безопасными», т.е. они могут передавать строки библиотекам, которые игнорируют данные после NUL-байта).

Принимая во внимание тот факт, что PHP не диктует определенную кодировку для строк, можно задать вопрос, как в таком случае кодируются строковые литералы. Например, строка «á» эквивалентна «\xE1» (ISO-8859-1), «\xC3\xA1» (UTF-8, форма нормализации C), «\x61\xCC\x81» (UTF-8, форма нормализации D) или какому-либо другому возможному представлению? Ответом является следующее: строка будет закодирована тем образом, которым она записана в файле скрипта. Таким образом, если скрипт записан в кодировке ISO-8859-1, то и строка будет закодирована в ISO-8859-1 и т.д. Однако, это правило не применяется при включенном режиме Zend Multibyte: в этом случае скрипт может быть записан в любой кодировке (которая указывается ясно или определяется автоматически), а затем конвертируются в определенную внутреннюю кодировку, которая и будет впоследствии использована для строковых литералов. Учтите, что на кодировку скрипта (или на внутреннюю кодировку, если включен режим Zend Multibyte) накладываются некоторые ограничения: практически всегда данная кодировка должна быть надмножеством ASCII, например, UTF-8 или ISO-8859-1. Учтите также, что кодировки, зависящие от состояния, где одни и те же значения байт могут быть использованы в начальном и не начальном состоянии сдвига (initial and non-inital shift state), могут вызвать проблемы.

Разумеется, чтобы приносить пользу, строковые функции должны сделать некоторые предположения о кодировке строки. К несчастью, среди PHP-функций довольно большое разнообразие подходов к этому вопросу:

В конечном счете, написание корректных программ, работающих с Unicode, означает осторожное избегание функций, которые не работают с Unicode и, скорее всего, испортят данные, и использование вместо них корректных функций, обычно из расширений intl и mbstring. Однако, использование функций, способных работать с Unicode, является самым началом. Вне зависимости от тех функций, которые предоставляет язык, необходимо знать спецификацию самого Unicode. Например, если программа предполагает существование в языке только строчных и заглавных букв, то она делает большую ошибку.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *