2011-08-17 18 views
14

Quiero mostrar los caracteres especiales en una fuente usando canvas fillText. El código es básicamente:Problema al entender canvas fillText con caracteres Unicode

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

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

context.fillText(hexstring,100,100); 

Si uso la primera hexstring, funciona y me sale el símbolo de copyright. Si uso el segundo, solo muestra \u00A9. Como necesito repetir los números, necesito usar el segundo para mostrar todos los caracteres especiales de una fuente. Estoy usando utf-8. ¿Qué estoy haciendo mal?

Respuesta

27

Uso String.fromCharCode para convertir un número en un personaje .

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

Si usted tiene una cadena hexadecimal codificado puede analizar que a medida que un número hexadecimal en primer lugar:

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

Para crear una cadena que contiene una serie de caracteres, puede crear una matriz de los números y luego use apply para pasarlos como argumentos al fromCharCode. Esto es más rápido que hacer string= string+String.fromCharCode(c) para cada carácter por separado.

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

Y, por supuesto, StackOverflow viene a mi rescate una vez más. Gracias bobince! –

0

ejemplo de trabajo

http://jsfiddle.net/sbYPj/

tiempo Eval :)

iterar a través de num y esto funcionará bien

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

por qué el voto por este funciona .... – samccone

+1

Deshecho el downvote ya que la verificación de expresiones regulares elimina la vulnerabilidad inmediata, pero todavía 'eval' es lento, feo, peligroso y [por lo general] (http: // stackoverflow .com/questions/86513/why-is-using-javascript-eval-function-a-bad-idea) es mejor evitarlo. – bobince

+1

[Esto es lo que primero pensé cuando leí la respuesta.] (Http://www.youtube.com/watch?v=TO5wryDdEI0) He usado todos mis votos por el día; Trataré de recordar regresar en cuatro horas. – sdleihssirhc