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>

10 réponses

1 2 3
Avatar
Duzz'
Le 08/11/2014 à 16:16, Julien Arlandis a écrit :

Si j'exécute dans la console javascript
String.fromCharCode(0xD834) + String.fromCharCode(0xDD1E)
on obtient bien une clé de sol.

String.fromCharCode(0xD834) + String.fromCharCode(0xDD1E)

Sur Nemo ceci fonctionne :

[c=xD834][c=xDD1E] : 4



Pas chez moi (Firefox).


--
Article publié avec Nemo : <http://news2.nemoweb.net/?
Avatar
Olivier Miakinen
Le 08/11/2014 16:16, Julien Arlandis a écrit :

Si j'exécute dans la console javascript
String.fromCharCode(0xD834) + String.fromCharCode(0xDD1E)
on obtient bien une clé de sol.



En toute rigueur, ça ne devrait pas le faire parce que ni
String.fromCharCode(0xD834) ni String.fromCharCode(0xDD1E) ne
sont des caractères valides.

La bonne méthode, ce serait :
String.fromCharCode(0xD834, 0xDD1E)

Sur Nemo ceci fonctionne :

[c=xD834][c=xDD1E] : 4



Ça ne devrait pas non plus : tu devrais interdire toute valeur
comprise entre xD800 et xDFFF pour éviter des séquences invalides.
En revanche, c'est [c=x1D11E] qui devrait générer le caractère
String.fromCharCode(0xD800+0x34, 0xDC00+0x11E).

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

Mais la transmission sur NNTP n'est pas bonne visiblement.



Il n'y a pas de raison, si tu fais les choses proprement, puisque ça
passe lorsque tu envoies le caractère normalement.
Avatar
Olivier Miakinen
Le 08/11/2014 16:21, Julien Arlandis a écrit :

La question qui se pose c'est quelle doit être la syntaxe de la balise
[c] pour encoder une clé de sol?



Oui, c'est la bonne question. ;-)

[c=xD834][c=xDD1E] est il correct ?



Non.

[c=xD834DD1E] est il correct ?



Non.

Autre proposition ?



[c=x1D11E]
Avatar
Julien Arlandis
Le 08/11/2014 à 16:36, Olivier Miakinen a écrit :
Le 08/11/2014 16:16, Julien Arlandis a écrit :

Si j'exécute dans la console javascript
String.fromCharCode(0xD834) + String.fromCharCode(0xDD1E)
on obtient bien une clé de sol.



En toute rigueur, ça ne devrait pas le faire parce que ni
String.fromCharCode(0xD834) ni String.fromCharCode(0xDD1E) ne
sont des caractères valides.

La bonne méthode, ce serait :
String.fromCharCode(0xD834, 0xDD1E)

Sur Nemo ceci fonctionne :

4 : 4



Ça ne devrait pas non plus : tu devrais interdire toute valeur
comprise entre xD800 et xDFFF pour éviter des séquences invalides.
En revanche, c'est  qui devrait générer le caractère
String.fromCharCode(0xD800+0x34, 0xDC00+0x11E).

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

Mais la transmission sur NNTP n'est pas bonne visiblement.



Il n'y a pas de raison, si tu fais les choses proprement, puisque ça
passe lorsque tu envoies le caractère normalement.



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);});

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);

--
Ce message a été posté avec Nemo : <http://news2.nemoweb.net/?
Avatar
Olivier Miakinen
Le 08/11/2014 16:33, Duzz' a écrit :

J'ai trouvé ceci :

Prenons le caractère « clé de sol » U+1D11E. Pour pouvoir le
représenter dans une chaine Java (pour rappel, je ne peux pas le stocker
dans un char), je dois faire la petite manipulation décrite chez
Wikipédia

retirer la valeur 0x10000
0xD11E
convertir en binaire et séparer les 10 bits de poids faible et les 10
bits de poids fort
0000110100 0100011110
ajouter 0XD800 aux bits de poids fort
0xD800 + 0x34 = 0xD834
ajouter 0xDC00 aux bits de poids faible
0xDC00 + 0x11E = 0xDD1E

la clé de sol sera représentable en Java par

String s = "uD834uDD1E";



Bravo ! Toi au moins tu sais lire les docs. ;-)

(c'était une petit pique pas méchante mais tellement vraie, hein
Julien ?)

La référence à Wikipédia :
<http://fr.wikipedia.org/wiki/Unicode#UTF-16>
Avatar
Olivier Miakinen
Le 08/11/2014 16:40, Julien Arlandis m'a répondu :

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.

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).
Avatar
Julien Arlandis
Le 08/11/2014 à 16:45, Olivier Miakinen a écrit :
Le 08/11/2014 16:40, Julien Arlandis m'a répondu :

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.



function(m) {
val = (m[0] != 'x') ? parseInt(m) : parseInt(m.substr(1));

if(val < 0xD800) {
return String.fromCharCode(val);
}else{
val -= 0x10000;
return String.fromCharCode(0xD800 + (val>>10), 0xDC00 + (val&0x3FF));
}
}


Ceci te parait correct ?

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



Qu'entends tu par écrire un encodage en UTF-8 ?

--
Ce message a été posté avec Nemo : <http://devnews.nemoweb.net/?Jid”
Avatar
Olivier Miakinen
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.
Avatar
Julien Arlandis
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');
Avatar
Julien Arlandis
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...
1 2 3