mb_detect_encoding

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_detect_encodingDetecta un encodage

Descripción

mb_detect_encoding(string $string, array|string|null $encodings = null, bool $strict = false): string|false

Detecta el encodage más probable para la chaîne de caractères string desde una lista ordenada de candidatos.

La detección automática del juego de caracteres previsto nunca es totalmente fiable; sin información adicional, es similar a descifrar una cadena cifrada sin la clave. Siempre es preferible utilizar una indicación del juego de caracteres almacenado o transmitido con los datos, como el encabezado HTTP "Content-Type".

Esta función se utiliza principalmente con encodages multioctetos, donde no todas las secuencias de octetos forman una cadena válida. Si la cadena de entrada contiene una secuencia de este tipo, este encodage será rechazado, y el siguiente encodage será verificado.

Advertencia

El resultado no es fiable

El nombre de esta función es engañoso, realiza una « suposición » en lugar de una « detección ».

Las suposiciones están lejos de ser precisas, y por lo tanto, esta función no permite detectar de manera fiable el encodage correcto de los caracteres.

Parámetros

string

La string siendo inspeccionada.

encodings

Una lista de encodages de caracteres a probar, en orden. Esta lista puede ser especificada como un tableau de chaîne de caractères, o como una chaîne de caractères única separada por comas.

Si encodings es omitido o null, el detect_order actual (definido con la opción de configuración mbstring.detect_order, o la función mb_detect_order()) será utilizado.

strict

Controla el comportamiento cuando string no es válido en ninguno de los encodings listados. Si strict está definido como false, el encodage que corresponda más será devuelto; si strict está definido como true, false será devuelto.

El valor por omisión de strict puede ser definido con la opción de configuración mbstring.strict_detection.

Valores devueltos

El encodage de caracteres detectado, o false si la cadena no es válida en uno de los encodages listados.

Historial de cambios

Versión Descripción
8.2.0 mb_detect_encoding() ya no devolverá los siguientes encodages no textuales: "Base64", "QPrint", "UUencode", "HTML entities", "7 bit" y "8 bit".

Ejemplos

Ejemplo #1 Ejemplo con mb_detect_encoding()

<?php

$str
= "\x95\xB6\x8E\x9A\x83\x52\x81\x5B\x83\x68";

// Detecta el encodage con el detect_order actual
var_dump(mb_detect_encoding($str));

// "auto" es modificado según mbstring.language
var_dump(mb_detect_encoding($str, "auto"));

// Especifica el parámetro "encodings" con una lista separada por comas
var_dump(mb_detect_encoding($str, "JIS, eucjp-win, sjis-win"));

// Uso de un array para especificar el parámetro "encodings"
$encodings = [
"ASCII",
"JIS",
"EUC-JP"
];
var_dump(mb_detect_encoding($str, $encodings));
?>

El resultado del ejemplo sería:

string(5) "ASCII"
string(5) "ASCII"
string(8) "SJIS-win"
string(5) "ASCII"

Ejemplo #2 Efecto del parámetro strict

<?php
// 'áéóú' encoded in ISO-8859-1
$str = "\xE1\xE9\xF3\xFA";

// La cadena no es válida en ASCII o UTF-8, pero UTF-8 es considerado un mejor ajuste
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8'], false));
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8'], true));

// Si un encodage válido es encontrado, el parámetro strict no cambia el resultado
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));
?>

El resultado del ejemplo sería:

string(5) "UTF-8"
bool(false)
string(10) "ISO-8859-1"
string(10) "ISO-8859-1"

En ciertos casos, la misma secuencia de octetos puede formar una cadena válida en diferentes encodages de caracteres, y es imposible determinar cuál interpretación era prevista. Un ejemplo, entre otros, la secuencia de octetos "\xC4\xA2" podría ser:

  • "Ä¢" (U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS seguido de U+00A2 CENT SIGN) codificado en ISO-8859-1, ISO-8859-15, o Windows-1252
  • "ФЂ" (U+0424 CYRILLIC CAPITAL LETTER EF seguido de U+0402 CYRILLIC CAPITAL LETTER DJE) codificado en ISO-8859-5
  • "Ģ" (U+0122 LATIN CAPITAL LETTER G WITH CEDILLA) codificado en UTF-8

Ejemplo #3 Efecto del orden cuando múltiples encodages coinciden

<?php
$str
= "\xC4\xA2";

// La cadena es válida en los tres encodages, por lo que el primero listado será devuelto
var_dump(mb_detect_encoding($str, ['UTF-8', 'ISO-8859-1', 'ISO-8859-5']));
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']));
?>

El resultado del ejemplo sería:

string(5) "UTF-8"
string(10) "ISO-8859-1"
string(10) "ISO-8859-5"

Ver también