1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 07:42:22 +01:00
Files
archived-doc-ru/reference/mbstring/functions/mb-detect-encoding.xml
2025-10-25 22:37:43 +03:00

289 lines
11 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 7c4b5fb40ac3149a5b931f1e31b1050ab5eaab7e Maintainer: tmn Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.mb-detect-encoding" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>mb_detect_encoding</refname>
<refpurpose>Определяет кодировку символов</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type class="union"><type>string</type><type>false</type></type><methodname>mb_detect_encoding</methodname>
<methodparam><type>string</type><parameter>string</parameter></methodparam>
<methodparam choice="opt"><type class="union"><type>array</type><type>string</type><type>null</type></type><parameter>encodings</parameter><initializer>&null;</initializer></methodparam>
<methodparam choice="opt"><type>bool</type><parameter>strict</parameter><initializer>&false;</initializer></methodparam>
</methodsynopsis>
<para>
Функция определяет наиболее вероятную кодировку символов значения с типом <type>string</type> в параметре <parameter>string</parameter>
путём проверки списка кандидатов по порядку.
</para>
<para>
Начиная с PHP 8.1 функция возвращает не первую возможную кодировку, а проверяет каждую допустимую кодировку
в списке <parameter>encodings</parameter> и эвристически определяет наиболее правильную.
</para>
<para>
Надёжность автоматического определения предполагаемой кодировки символов не достигает 100 %;
без дополнительной информации это похоже на расшифровку зашифрованной строки без ключа.
Лучше явно указать кодировку символов, которая хранится или передаётся с данными,
например в HTTP-заголовке Content-Type.
</para>
<para>
Функция полезнее при вызове с многобайтовыми кодировками,
поскольку не каждая последовательность байтов образует допустимую строку.
Функция отклонит кодировку,
если входная строка содержит такую последовательность.
</para>
<warning>
<title>Неточность результата</title>
<para>
Название функции вводит в заблуждение: функция «угадывает» кодировку, а не «обнаруживает».
</para>
<para>
Догадки неточны, поэтому функцией невозможно точно
определить правильную кодировку символов.
</para>
</warning>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>string</parameter></term>
<listitem>
<para>
Проверяемая строка (<type>string</type>).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>encodings</parameter></term>
<listitem>
<para>
Список кодировок символов для проверки.
Список определяется как массив строк или как строка со списком кодировок через запятую.
</para>
<para>
При пропуске параметра <parameter>encodings</parameter> или установке для параметра значения &null;
выбирается текущий порядок определения кодировки, который установили
в директиве <link linkend="ini.mbstring.detect-order">mbstring.detect_order</link> настроек конфигурации
или функцией <function>mb_detect_order</function>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>strict</parameter></term>
<listitem>
<para>
Управляет поведением, когда строка в параметре <parameter>string</parameter>
недопустима ни для одной перечисленной в параметре <parameter>encodings</parameter> кодировки.
При передаче в параметр <parameter>strict</parameter> значения &false;
возвращается первая совпавшая кодировка;
при установке для параметра <parameter>strict</parameter> значения &true;
возвращается значение &false;.
</para>
<para>
Значение по умолчанию для параметра <parameter>strict</parameter>
также устанавливается в директиве
<link linkend="ini.mbstring.strict-detection">mbstring.strict_detection</link>
настроек конфигурации.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Функция возвращает кодировку символов, которую обнаружила, или &false;,
если строка недопустима ни для одной из перечисленных кодировок.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.2.0</entry>
<entry>
Функция <function>mb_detect_encoding</function> больше не возвращает
следующие нетекстовые кодировки:
<literal>"Base64"</literal>, <literal>"QPrint"</literal>,
<literal>"UUencode"</literal>, <literal>"HTML entities"</literal>,
<literal>"7 bit"</literal> и <literal>"8 bit"</literal>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Пример определения кодировки функцией <function>mb_detect_encoding</function></title>
<programlisting role="php">
<![CDATA[
<?php
$str = "\x95\xB6\x8E\x9A\x83\x52\x81\x5B\x83\x68";
// Определение кодировки символов с текущим порядком определения
var_dump(mb_detect_encoding($str));
// Значение "auto" раскрывается в соответствии с директивой mbstring.language
var_dump(mb_detect_encoding($str, "auto"));
// Установка параметра "encodings" списком значений через запятую
var_dump(mb_detect_encoding($str, "JIS, eucjp-win, sjis-win"));
// Установка параметра "encodings" массивом
$encodings = [
"ASCII",
"JIS",
"EUC-JP"
];
var_dump(mb_detect_encoding($str, $encodings));
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
string(5) "ASCII"
string(5) "ASCII"
string(8) "SJIS-win"
string(5) "ASCII"
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Действие параметра <parameter>strict</parameter></title>
<programlisting role="php">
<![CDATA[
<?php
// Строка "áéóú" в кодировке ISO-8859-1
$str = "\xE1\xE9\xF3\xFA";
// Строка недопустима для кодировок ASCII или UTF-8, но UTF-8 считается более близким соответствием
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8'], false));
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8'], true));
// При обнаружении допустимой кодировки параметр strict не изменяет результат
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8', 'ISO-8859-1'], false));
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8', 'ISO-8859-1'], true));
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
string(5) "UTF-8"
bool(false)
string(10) "ISO-8859-1"
string(10) "ISO-8859-1"
]]>
</screen>
</example>
</para>
<para>
Иногда одна и та же последовательность байтов образовывает
допустимую строку в нескольких кодировках символов, и невозможно узнать, какая интерпретация подразумевалась.
Например, среди многих других байтовая последовательность "\xC4\xA2" допустима для:
</para>
<para>
<simplelist>
<member>
«Ä¢» (U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS с последующим U+00A2 CENT SIGN),
закодированная в одной из кодировок — ISO-8859-1, ISO-8859-15 или Windows-1252
</member>
<member>
«ФЂ» (U+0424 CYRILLIC CAPITAL LETTER EF с последующим U+0402 CYRILLIC CAPITAL LETTER
DJE), закодированная в ISO-8859-5
</member>
<member>
«Ģ» (U+0122 LATIN CAPITAL LETTER G WITH CEDILLA), закодированная в UTF-8
</member>
</simplelist>
</para>
<para>
<example>
<title>Действие порядка кодировок при совпадении нескольких кандидатов</title>
<programlisting role="php">
<![CDATA[
<?php
$str = "\xC4\xA2";
// Строка действительна в каждой из трёх кодировок,
// но вернётся не первая возможная, а наиболее корректная
var_dump(mb_detect_encoding($str, ['UTF-8']));
var_dump(mb_detect_encoding($str, ['UTF-8', 'ISO-8859-1', 'ISO-8859-5'])); // С php8.1 вернётся кодировка ISO-8859-1, а не UTF-8
var_dump(mb_detect_encoding($str, ['ISO-8859-1', 'ISO-8859-5', 'UTF-8']));
var_dump(mb_detect_encoding($str, ['ISO-8859-5', 'UTF-8', 'ISO-8859-1']));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
string(5) "UTF-8"
string(10) "ISO-8859-1"
string(10) "ISO-8859-1"
string(10) "ISO-8859-5"
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>mb_detect_order</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->