2011-08-17 116 views
14

我想使用畫布fillText在字體中顯示特殊字符。該代碼基本上是:使用unicode字符瞭解canvas fillText的問題

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

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

context.fillText(hexstring,100,100); 

如果我用第hexstring,它的工作原理和我得到的版權符號。如果我使用第二個,它只顯示\u00A9。由於我需要遍歷數字,我需要使用第二個顯示字體的所有特殊字符。我正在使用utf-8。我究竟做錯了什麼?

回答

27

使用String.fromCharCode把一個數字字符。

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

如果你有一個十六進制編碼的串可以解析爲十六進制數第一:

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

要創建包含一系列字符的字符串,可以創建的數字Array然後使用apply將它們作爲參數傳遞給fromCharCode。這比分別爲每個角色做string= string+String.fromCharCode(c)要快。

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

當然,StackOverflow再次爲我解救。感謝bobince! –

0

工作示例

http://jsfiddle.net/sbYPj/

評估和演示時間:)

迭代通過NUM,這會工作得很好

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

爲什麼向下表決通過了該工程.... – samccone

+1

撤銷的downvote因爲正則表達式檢查消除眼前的漏洞,但還是'eval'是緩慢的,醜陋的,危險的,[通常](HTTP://計算器.com/questions/86513/why-is-using-javascript-eval-function-a-bad-idea)最好避免。 – bobince

+1

[這是我讀到答案時首先想到的。](http://www.youtube.com/watch?v=TO5wryDdEI0)我已經使用了所有的讚揚詞,我會盡量記得在四小時內回來。 – sdleihssirhc