2 votes

Tester la chaîne de caractères non UTF-8

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().

0voto

myol Points 826

D'accord, il s'avère que vous devez utiliser strict pour vérifier que la fonction mb_detect_encoding() est quasiment inutile.

$item = mb_convert_encoding('Котёнок', 'KOI8-R');

$sanitized = $this->reEncode($item);

$this->assertEquals('KOI8-R', mb_detect_encoding($item, 'KOI8-R', true));
this-\>assertEquals('UTF-8', mb_detect_encoding($sanitised, 'UTF-8', true));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X