(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
mb_detect_encoding — Detectar a codificação de caracteres
$string
, array|string|null$encodings
= null
, bool$strict
= false
): string|false Detecta a codificação de caracteres mais provável para a stringstring
a partir de uma lista ordenada de candidatos.
A detecção automática da codificação de caracteres pretendida nunca pode ser totalmente confiável; sem informações adicionais, é semelhante a decodificar uma string criptografada sem a chave. É sempre preferível usar uma indicação de codificação de caracteres armazenada ou transmitida com os dados, como um cabeçalho HTTP "Content-Type".
Esta função é mais útil com codificações multibyte, onde nem todas as sequências de bytes formam uma string válida. Se a string de entrada contiver tal sequência, essa codificação será rejeitada e a próxima codificação será verificada.
string
A string sendo inspecionada.
encodings
Uma lista de codificações de caracteres para tentar, em ordem. A lista pode ser especificada como um array de strings ou uma única string separada por vírgulas.
Se encodings
for omitido ou null
, a detect_order atual (definida com a opção de configuração mbstring.detect_order, ou função mb_detect_order()) será usada.
strict
Controla o comportamento quando string
não é válida em nenhuma das encodings
listadas. Se strict
for definido como false
, a codificação mais próxima correspondente será retornada; se strict
for definido como true
, false
será retornado.
O valor padrão para strict
pode ser definido com a opção de configuração mbstring.strict_detection.
A codificação de caracteres detectada ou false
se a string não for válida em nenhuma das codificações listadas.
Versão | Descrição |
---|---|
8.2.0 | mb_detect_encoding() não retornará mais as seguintes codificações não textuais: "Base64" , "QPrint" , "UUencode" , "HTML entities" , "7 bit" e "8 bit" . |
Exemplo #1 Exemplo de mb_detect_encoding()
<?php
// Detectar codificação de caracteres com a detect_order atual
echo mb_detect_encoding($str);
// "auto" é expandido de acordo com mbstring.language
echo mb_detect_encoding($str, "auto");
// Especificar parâmetro "encodings" por lista separada por vírgula
echo mb_detect_encoding($str, "JIS, eucjp-win, sjis-win");
// Usar array para especificar parâmetro "encodings"
$encodings = [
"ASCII",
"JIS",
"EUC-JP"
];
echo mb_detect_encoding($str, $encodings);
?>
Exemplo #2 Efeito do parâmetro strict
<?php
// 'áéóú' codificado em ISO-8859-1
$str = "\xE1\xE9\xF3\xFA";
// A string não é válida em ASCII ou UTF-8, mas UTF-8 é considerado uma correspondência mais próxima
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8'], false));
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8'], true));
// Se uma codificação válida for encontrada, o parâmetro strict não muda o 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));
?>
O exemplo acima produzirá:
string(5) "UTF-8" bool(false) string(10) "ISO-8859-1" string(10) "ISO-8859-1"
Em alguns casos, a mesma sequência de bytes pode formar uma string válida em várias codificações de caracteres, e é impossível saber qual interpretação foi pretendida. Por exemplo, entre muitos outros, a sequência de bytes "\xC4\xA2" poderia ser:
Exemplo #3 Efeito da ordem quando várias codificações correspondem
<?php
$str = "\xC4\xA2";
// A string é válida em todas as três codificações, então a primeira listada será retornada
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']));
?>
O exemplo acima produzirá:
string(5) "UTF-8" string(10) "ISO-8859-1" string(10) "ISO-8859-5"