Maison  >  Article  >  développement back-end  >  Comment convertir php utf8 en unicode

Comment convertir php utf8 en unicode

藏色散人
藏色散人original
2020-07-18 09:29:333453parcourir

Comment convertir php utf8 en unicode : créez d'abord un exemple de fichier PHP ; puis définissez une méthode "utf8_str_to_unicode" ; puis implémentez la fonction de conversion via les fonctions ord et dechex ;

Comment convertir php utf8 en unicode

PHP implémente la conversion mutuelle entre l'encodage Unicode et Utf-8

Récemment, j'ai eu besoin d'utiliser Unicode conversion d'encodage, j'ai vérifié les fonctions de la bibliothèque PHP, mais je n'ai pas trouvé de fonction capable d'encoder et de décoder les chaînes Unicode ! Eh bien, si vous ne le trouvez pas, implémentez-le vous-même. . .

La différence entre l'encodage Unicode et Utf-8

Unicode est un jeu de caractères, et UTF-8 est l'un des Unicode à longueur fixe. , alors que UTF-8 est variable Pour les caractères chinois, Unicode occupe 1 octet de moins que UTF-8. Unicode est composé de deux octets, tandis que les caractères chinois en UTF-8 occupent trois octets.

Les caractères codés en UTF-8 peuvent théoriquement mesurer jusqu'à 6 octets, mais les caractères BMP (Basic Multilingual Plane) 16 bits ne peuvent mesurer que 3 octets. Jetons un coup d'œil à la table d'encodage UTF-8 : La position de

U-00000000 - U-0000007F: 0xxxxxxx 
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx 
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

xxx est remplie par la représentation binaire du numéro d'encodage du caractère. Le x le plus à droite a une signification moins particulière, et seul le numéro d'encodage du caractère. le plus court suffit pour l'exprimer. Une chaîne multi-octets de nombres de codage de caractères. Notez que dans une chaîne multi-octets, le nombre de « 1 » au début du premier octet correspond au nombre d’octets dans la chaîne entière. La première ligne commence par 0 pour être compatible avec le codage ASCII, qui est d'un octet, la deuxième ligne est une chaîne à deux octets, la troisième ligne est de 3 octets, comme les caractères chinois, et ainsi de suite. (Personnellement, je pense : en fait, nous pouvons simplement considérer le nombre de 1 devant comme le nombre d'octets)

Comment convertir Unicode en Utf-8

Dans Pour convertir Unicode en UTF-8, vous devez bien sûr savoir quelle est la différence. Voyons comment l'encodage en Unicode est converti en UTF-8, si l'octet d'un caractère est inférieur à 0x80 (128), il s'agit d'un caractère ASCII, occupant un octet, et aucune conversion n'est effectuée. nécessaire car UTF-8 est compatible avec le codage ASCII. Si le codage du caractère chinois « vous » en Unicode est « u4F60 », convertissez-le en binaire en 100111101100000, puis convertissez-le selon la méthode UTF-8. Les chiffres binaires peuvent être extraits du binaire Unicode de bas en haut, en prenant 6 chiffres à la fois. Par exemple, les chiffres binaires ci-dessus peuvent être extraits dans le format indiqué ci-dessous. Les précédents sont remplis selon le format, et n'importe lequel. moins de 8 bits sont remplis par 0.

unicode: 100111101100000                   4F60
utf-8:    11100100,10111101,10100000       E4BDA0

À partir de ce qui précède, vous pouvez voir intuitivement la conversion entre Unicode et UTF-8. Bien sûr, après avoir connu le format UTF-8, vous pouvez effectuer l'opération inverse, c'est-à-dire le convertir en binaire. selon le format, retirez-le de la position correspondante, puis convertissez-le en le caractère Unicode résultant (cette opération peut être effectuée par "déplacement"). Par exemple, dans la conversion ci-dessus de « vous », puisque sa valeur est supérieure à 0x800 et inférieure à 0x10000, elle peut être considérée comme un stockage sur trois octets. Ensuite, le bit le plus élevé doit être décalé vers la droite de « 12 » bits. puis selon le format sur trois octets, le bit le plus élevé est 11100000 (0xE0 ) ou (|) pour obtenir la valeur la plus élevée. De la même manière, le deuxième chiffre est décalé vers la droite de "6" bits, et la valeur binaire du chiffre le plus élevé et du deuxième chiffre est à gauche. Elle peut être calculée en effectuant l'opération de position (&) avec 111111 (0x3F. ), puis additionné avec 11000000 (0x80 ou (|). Il n'est pas nécessaire de décaler le troisième bit, prenez simplement les six derniers bits directement (& avec 111111 (ox3F)), puis OU (|) avec 11000000 (0x80).

Comment inverser Utf-8 en Unicode

Bien sûr, la conversion d'UTF-8 en Unicode se fait également par décalage, etc., c'est-à-dire conversion UTF-8 Le nombre binaire dans la position correspondante du format est extrait. Dans l'exemple ci-dessus, « vous » fait trois octets, donc chaque octet doit être traité, du bit haut au bit bas.

En UTF-8, "vous" vaut 11100100,10111101,10100000. En partant du bit haut, le premier octet 11100100 consiste à retirer le "0100". C'est très simple. Il suffit de prendre le AND (&) avec 11111 (0x1F), on peut savoir que la position la plus élevée doit être. être avant le 12ème bit, car six chiffres sont pris à chaque fois.

Le résultat doit donc être décalé vers la gauche de 12 bits, et le bit le plus élevé est désormais 0100,000000,000000. Le deuxième bit consiste à supprimer "111101", il vous suffit donc de AND (&) le deuxième octet 10111101 et 111111 (0x3F). Après avoir décalé le résultat de 6 bits vers la gauche et pris le résultat de l'octet le plus élevé ou (|), le deuxième bit est terminé et le résultat est 0100,111101,000000.

Par analogie, le dernier chiffre est directement AND (&) avec 111111 (0x3F), puis OR (|) avec le résultat précédent pour obtenir le résultat 0100,111101,100000.

Implémentation du code PHP

/**
 * utf8字符转换成Unicode字符
 * @param  [type] $utf8_str Utf-8字符
 * @return [type]           Unicode字符
 */
function utf8_str_to_unicode($utf8_str) {
    $unicode = 0;
    $unicode = (ord($utf8_str[0]) & 0x1F) << 12;
    $unicode |= (ord($utf8_str[1]) & 0x3F) << 6;
    $unicode |= (ord($utf8_str[2]) & 0x3F);
    return dechex($unicode);
}
/**
 * Unicode字符转换成utf8字符
 * @param  [type] $unicode_str Unicode字符
 * @return [type]              Utf-8字符
 */
function unicode_to_utf8($unicode_str) {
    $utf8_str = &#39;&#39;;
    $code = intval(hexdec($unicode_str));
    //这里注意转换出来的code一定得是整形,这样才会正确的按位操作
    $ord_1 = decbin(0xe0 | ($code >> 12));
    $ord_2 = decbin(0x80 | (($code >> 6) & 0x3f));
    $ord_3 = decbin(0x80 | ($code & 0x3f));
    $utf8_str = chr(bindec($ord_1)) . chr(bindec($ord_2)) . chr(bindec($ord_3));
    return $utf8_str;
}

Je l'ai testé

$utf8_str = &#39;我&#39;;
//这是汉字“你”的Unicode编码
$unicode_str = &#39;4f6b&#39;;
//输出 6211
echo utf8_str_to_unicode($utf8_str) . "<br/>";
//输出汉字“你”
echo unicode_str_to_utf8($unicode_str);

Les conversions ci-dessus sont des tests pour les caractères chinois [qui sont généralement non-ASCII], car s'ils sont ASCII, c'est le c'est encore la même chose, donc il n'est pas nécessaire de dépenser autant d'efforts.

De plus, ces deux fonctions sont simplement implémentées et ne prennent en charge que la conversion d'un seul caractère [un caractère utf8 complet ou un caractère Unicode complet] l'une vers l'autre. Si vous le comprenez, vous pouvez en profiter. . .

Recommandé : "Tutoriel PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn