J'ai lu d'autres fils de discussion sur ce sujet, mais je ne comprends pas ce que je fais de mal.
J'ai une fonction
public function reEncode($item)
{
if (! mb_detect_encoding($item, 'utf-8', true)) {
$item = utf8_encode($item);
}
return $item;
}
Je suis en train d'écrire un test pour cela. Je veux tester une chaîne qui n'est pas en UTF-8
pour voir si cette instruction est exécutée. J'ai du mal à créer la chaîne de test.
$contents = file_get_contents('CyrillicKOI8REncoded.txt');
var_dump(mb_detect_encoding($contents));
$sanitized = $this->reEncode($contents);
var_dump(mb_detect_encoding($sanitized));
Au début, j'ai utilisé file_get_contents
sur un fichier que j'ai encodé avec divers encodages dans sublime; Cyrillic (KOI8-R)
, HEX
et DOS (CP 437)
car il a été dit que file_get_contents()
ignore l'encodage du fichier. Cela semble être vrai car les caractères retournés sont un gâchis confus.
Cela dit, à chaque fois que j'utilise mb_detect_encoding()
sur ces variables, j'obtiens toujours ASCII
ou UTF-8
. L'instruction n'est jamais déclenchée car ASCII
est un sous-ensemble de UTF-8
.
J'ai donc essayé mb_convert_encoding()
et iconv()
pour convertir une chaîne de base en UTF-16
, UTF-32
, base64
, hex
etc etc mais à chaque fois, mb_detect_encoding()
renvoie ASCII
ou UTF-8
Dans mes tests, je veux affirmer le type d'encodage avant et après l'appel de cette fonction.
$sanitized = $this->reEncode($contents);
$this->assertEquals('UTF-32', mb_detect_encoding($contents));
this->assertEquals('UTF-8', mb_detect_encoding($sanitized));
Je ne comprends pas quelle erreur je fais constamment pour obtenir ASCII
ou UTF-8
retourné par mb_detect_encoding()
.