2010-10-04 9 views

Répondre

1

Tout d'abord, voici le document that definitively defines UTF-8 encoding.

Les deux octets dans votre exemple: 110xxxxx 10xxxxxx encodent une de caractères Unicode. Son code binaire est - bien, il suffit de prendre ces x (bits) et de les assembler. Vous obtiendrez un nombre binaire, mais vous pouvez le convertir en décimal ou en hexadécimal si vous le souhaitez. C'est le même nombre que XXXX dans U + XXXX.

Comment ai-je savoir que 110xxxxx 10xxxxxx encode un personnage? Il peut y avoir trois types d'octets dans un flux UTF-8:

  • 10xxxxxx - octets de fin
  • 0xxxxxxx - caractères ASCII
  • 110xxxxx, 1110xxxx, etc. - principaux octets dans la séquence.

Des séquences d'octets de début et de fin sont utilisées pour coder les points Unicode de 128 et plus. 110xxxxx signifie qu'il commence une séquence de deux octets, 1110xxxx démarre une séquence de trois octets, etc. De cette façon, vous pouvez isoler les séquences les unes des autres. Ensuite, prenez x de tous les octets de la séquence et c'est votre point de code Unicode.

3

Vous pouvez tirer parti iconv du décodeur UTF-8 pour éviter d'avoir à écrire vous-même:

function utf8_to_codepoints($s) { 
    return unpack('V*', iconv('UTF-8', 'UCS-4LE', $s)); 
} 

$data= "Caf\xc3\xa9 \xe6\x97\xa5\xe6\x9c\xac \xf0\x9d\x84\x9e"; // Café 日本 
var_export(utf8_to_codepoints($data)); 

donne:

array (
    1 => 67, 
    2 => 97, 
    3 => 102, 
    4 => 233, 
    5 => 32, 
    6 => 26085, 
    7 => 26412, 
    8 => 32, 
    9 => 119070, 
) 

qui peut être converti en format U + nnnn en utilisant dechex.

Questions connexes