Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

test balise [c]

23 réponses
Avatar
Julien Arlandis
test clé de sol :

[c=x1D11E] => 

Ce n'est pas une clé de sol...

Pourquoi ?


--
Ce message a été posté avec Nemo : <http://news2.nemoweb.net/?Jid=47bcc45ec1de5d1f92d2cd392e7fa707ce7b647c@news2.nemoweb.net>

3 réponses

1 2 3
Avatar
Julien Arlandis
Le 08/11/2014 à 19:28, Julien Arlandis a écrit :
Le 08/11/2014 à 18:15, Julien Arlandis a écrit :
Le 08/11/2014 à 17:02, Olivier Miakinen a écrit :
Le 08/11/2014 16:45, je répondais à Julien :

Si je ne m'abuse, ça doit être un truc comme ça :
valeur = 0x1D11E - 0x10000;
s = String.fromCharCode(0xD800 + (valeur>>10), 0xDC00 +
(valeur&0x3FF));





Je laisse le code ci-dessus, puisque visiblement tu ne l'as pas vu.

Est ce que tu pourrais me corriger la fonction javascript :

var reg = /[c=(x?[0-9a-fA-F]+)]/g;
body = body.replace(reg, function(s, m){num = (m[0] != 'x') ?
parseInt(m) :
parseInt(m.substr(1), 16); return String.fromCharCode(num);});



Non, tu ne peux pas traiter par un fromCharCode à un seul paramètre
les caractères en dehors du plan de base. Cf. ci-dessus, je t'ai
déjà
répondu, et tu peux voir aussi la réponse de Duzz.



Pour être plus complet, après le 'num = parseInt(...)', il faudrait un
truc du genre :
if (unicodeIsValid(num)) {
if (num <= 0xFFFF) {
return String.fromCharCode(num);
} else {
num -= 0x10000;
return String.fromCharCode(0xD800+(num>>10), 0xDC00+(num&0x3FF));
}
} else {
return "?";
}

Où la fonction unicodeIsValid() doit éliminer tous les codes invalides
(cf. les docs si tu sais faire, là je n'ai pas trop le temps).

Et pour le PHP :

$body = preg_replace_callback('/[c=(x?[0-9a-fA-F]+)]/', function
($matches) {
$num = ($matches[1][0] != 'x') ? $matches[1] :
hexdec(substr($matches[1],
1));
return chr($num);
},$body);



Certainement pas non plus. Il faut écrire un encodage en UTF-8 en
PHP,
de même que pour JavaScript il faut un encodage en UTF-16 (mais c'est
plus facile).



Une solution pourrait être de faire le même traitement que pour
UTF-16,
puis à passer un petit coup d'iconv() d'UTF-16 vers UTF-8.



Pour les valeurs < 0xFFFF ceci fonctionne :
mb_convert_encoding('&#x5b;', 'UTF-8', 'HTML-ENTITIES');

Mais pas mb_convert_encoding('&#x1d11e;', 'UTF-8', 'HTML-ENTITIES');




J'ai également essayé ceci :
$intval = 0x1D11E;


echo mb_convert_encoding(pack('n', $intval), 'UTF-8', 'UTF-16BE');

Si tu as une idée...



En fait, si ça fonctionne bien en php, la preuve :

<html>
<head>
<meta charset="UTF-8">
</head>
</body>
<?php
$body = '
Avatar
Julien Arlandis
Le 08/11/2014 à 19:42, Julien Arlandis a écrit :
Le 08/11/2014 à 19:28, Julien Arlandis a écrit :
Le 08/11/2014 à 18:15, Julien Arlandis a écrit :
Le 08/11/2014 à 17:02, Olivier Miakinen a écrit :
Le 08/11/2014 16:45, je répondais à Julien :

Si je ne m'abuse, ça doit être un truc comme ça :
valeur = 0x1D11E - 0x10000;
s = String.fromCharCode(0xD800 + (valeur>>10), 0xDC00 +
(valeur&0x3FF));





Je laisse le code ci-dessus, puisque visiblement tu ne l'as pas vu.

Est ce que tu pourrais me corriger la fonction javascript :

var reg = /[c=(x?[0-9a-fA-F]+)]/g;
body = body.replace(reg, function(s, m){num = (m[0] != 'x') ?
parseInt(m) :
parseInt(m.substr(1), 16); return String.fromCharCode(num);});



Non, tu ne peux pas traiter par un fromCharCode à un seul
paramètre
les caractères en dehors du plan de base. Cf. ci-dessus, je t'ai
déjà
répondu, et tu peux voir aussi la réponse de Duzz.



Pour être plus complet, après le 'num = parseInt(...)', il faudrait
un
truc du genre :
if (unicodeIsValid(num)) {
if (num <= 0xFFFF) {
return String.fromCharCode(num);
} else {
num -= 0x10000;
return String.fromCharCode(0xD800+(num>>10),
0xDC00+(num&0x3FF));
}
} else {
return "?";
}

Où la fonction unicodeIsValid() doit éliminer tous les codes
invalides
(cf. les docs si tu sais faire, là je n'ai pas trop le temps).

Et pour le PHP :

$body = preg_replace_callback('/[c=(x?[0-9a-fA-F]+)]/', function

($matches) {
$num = ($matches[1][0] != 'x') ? $matches[1] :
hexdec(substr($matches[1],
1));
return chr($num);
},$body);



Certainement pas non plus. Il faut écrire un encodage en UTF-8 en
PHP,
de même que pour JavaScript il faut un encodage en UTF-16 (mais
c'est
plus facile).



Une solution pourrait être de faire le même traitement que pour
UTF-16,
puis à passer un petit coup d'iconv() d'UTF-16 vers UTF-8.



Pour les valeurs < 0xFFFF ceci fonctionne :
mb_convert_encoding('&#x5b;', 'UTF-8', 'HTML-ENTITIES');

Mais pas mb_convert_encoding('&#x1d11e;', 'UTF-8', 'HTML-ENTITIES');




J'ai également essayé ceci :
$intval = 0x1D11E;




echo mb_convert_encoding(pack('n', $intval), 'UTF-8', 'UTF-16BE');

Si tu as une idée...



En fait, si ça fonctionne bien en php, la preuve :

<html>


<head>
<meta charset="UTF-8">
</head>
</body>
<?php
$body = '
Avatar
Duzz'
Le 08/11/2014 à 19:42, Julien Arlandis a écrit :
Le 08/11/2014 à 19:28, Julien Arlandis a écrit :


J'ai également essayé ceci :
$intval = 0x1D11E;




echo mb_convert_encoding(pack('n', $intval), 'UTF-8', 'UTF-16BE');

Si tu as une idée...



En fait, si ça fonctionne bien en php, la preuve :

<html>


<head>
<meta charset="UTF-8">
</head>
</body>
<?php
$body = '
1 2 3