2011-08-17 1 views
14

Desidero visualizzare i caratteri speciali in un carattere utilizzando la tela fillText. Il codice è fondamentalmente:Problema di comprensione della tela riempimentoTesto con caratteri unicode

canvas = document.getElementById("mycanvas"); 
context = canvas.getContext("2d"); 

hexstring = "\u00A9"; 
//hexstring = "\\u" +"00A9"; 

context.fillText(hexstring,100,100); 

Se uso il primo hexstring, funziona e ottengo il simbolo di copyright. Se uso il secondo, visualizza solo \u00A9. Poiché ho bisogno di scorrere i numeri, ho bisogno di usare il secondo per visualizzare tutti i caratteri speciali di un font. Sto usando utf-8. Che cosa sto facendo di sbagliato?

risposta

27

Usa String.fromCharCode di trasformare un numero in un carattere .

var c= 169; // 0xA9 
context.fillText(String.fromCharCode(c), 100, 100); 

Se ha uno stringa esadecimale codificata è possibile analizzare che come numero esadecimale primo:

var h= '00A9'; 
String.fromCharCode(parseInt(h, 16)); 

Per creare una stringa contenente una serie di caratteri, è possibile creare una matrice di numeri e quindi utilizzare apply per passarli come argomenti a fromCharCode. Questo è più veloce di fare string= string+String.fromCharCode(c) per ogni carattere separatamente.

function makeRange(n0, n1) { 
    var a= []; 
    for (; n0<n1; n++) 
     a.push(n0); 
} 

var someChars= makeRange(0xA9, 0xFF); 
var stringOfChars= String.fromCharCode.apply(String, someChars); 
+1

E naturalmente StackOverflow mi viene in soccorso ancora una volta. Grazie bobince! –

0

esempio di lavoro

http://jsfiddle.net/sbYPj/

tempo Eval :)

iterare attraverso num e questo funzionerà bene

var num = value; 
var uni = '"\\u' + num+'"'; 
var result; 
if (/^[A-F\d]{4}$/.test(num)) 
{ 
    result = eval(uni); 
} 
+0

motivo per cui il voto verso il basso questo funziona .... – samccone

+1

Undone il downvote dal momento che il controllo regex elimina la vulnerabilità immediato, ma ancora 'eval' è lento, brutto, pericoloso e [di solito] (http: // StackOverflow .com/questions/86513/why-is-using-javascript-eval-function-a-bad-idea) meglio evitare. – bobince

+1

[Questo è quello che ho pensato per primo quando ho letto la risposta.] (Http://www.youtube.com/watch?v=TO5wryDdEI0) Ho usato tutti i miei upvotes per il giorno; Proverò a ricordare di tornare tra quattro ore. – sdleihssirhc