2011-08-17 15 views
14

Chcę wyświetlić znaki specjalne w czcionce przy użyciu kanwy fillText. Kod jest zasadniczo:Problem ze zrozumieniem canvas fillText ze znakami Unicode

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

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

context.fillText(hexstring,100,100); 

Jeśli użyję pierwszy hexstring, to działa i pojawia się symbol praw autorskich. Jeśli używam drugiego, po prostu wyświetla się \u00A9. Ponieważ potrzebuję do iteracji liczb, muszę użyć drugiej, aby wyświetlić wszystkie znaki specjalne czcionki. Używam utf-8. Co ja robię źle?

Odpowiedz

27

Zastosowanie String.fromCharCode zamienić liczbę na znak .

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

Jeśli masz ciąg szesnastkowy zakodowany można analizować że jako liczba szesnastkowa pierwsze:

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

Aby utworzyć ciąg zawierający szereg znaków można utworzyć tablicę liczb a następnie użyj apply, aby przekazać je jako argumenty do fromCharCode. Jest to szybsze niż wykonanie string= string+String.fromCharCode(c) dla każdej postaci osobno.

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

I oczywiście, StackOverflow przychodzi mi na ratunek jeszcze raz. Dzięki Bobu! –

0

przykładem pracy

http://jsfiddle.net/sbYPj/

czas Eval :)

iterację num i to będzie działać dobrze

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

dlaczego głosowanie na dół to działa .... – samccone

+1

Undone downvote ponieważ kontrola regex usuwa lukę natychmiastowy, ale nadal 'eval' jest powolny, brzydkie, niebezpieczne i [zwykle] (http: // stackoverflow .pl/questions/86513/why-using-javascript-eval-function-a-bad-idea) najlepiej unikać. – bobince

+1

[To jest to, co najpierw pomyślałem, kiedy przeczytałem odpowiedź.] (Http://www.youtube.com/watch?v=TO5wryDdEI0) Użyłem wszystkich moich awansów na cały dzień; Spróbuję pamiętać o powrocie za cztery godziny. – sdleihssirhc

Powiązane problemy