2011-08-17 23 views
14

Tôi muốn hiển thị các ký tự đặc biệt trong phông chữ bằng canvas fillText. Mã cơ bản:Sự cố khi hiểu canvas fillText với các ký tự unicode

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

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

context.fillText(hexstring,100,100); 

Nếu tôi sử dụng hexstring đầu tiên, nó hoạt động và tôi nhận được biểu tượng bản quyền. Nếu tôi sử dụng thứ hai, nó chỉ hiển thị \u00A9. Vì tôi cần phải lặp qua các con số, tôi cần sử dụng số thứ hai để hiển thị tất cả các ký tự đặc biệt của phông chữ. Tôi đang sử dụng utf-8. Tôi đang làm gì sai?

Trả lời

27

Sử dụng String.fromCharCode để biến một số thành một nhân vật .

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

Nếu bạn có một chuỗi hex-mã hóa, bạn có thể phân tích cú pháp đó như là một số hex đầu tiên:

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

Để tạo một chuỗi chứa một loạt các nhân vật, bạn có thể tạo một mảng của các con số và sau đó sử dụng apply để chuyển chúng làm đối số cho fromCharCode. Điều này nhanh hơn làm string= string+String.fromCharCode(c) cho mỗi ký tự riêng biệt.

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

Và tất nhiên, StackOverflow đến để giải cứu tôi một lần nữa. Cảm ơn bobince! –

0

dụ làm việc

http://jsfiddle.net/sbYPj/

Eval thời gian :)

lặp qua num và điều này sẽ chỉ làm việc tốt

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

tại sao bỏ phiếu xuống làm việc này .... – samccone

+1

Undone downvote kể từ ngày séc regex loại bỏ các lỗ hổng ngay lập tức, nhưng vẫn 'eval' là chậm, xấu xí, nguy hiểm và [thường] (http: // stackoverflow .com/questions/86513/why-is-using-javascript-eval-chức năng-a-bad-idea) tốt nhất nên tránh. – bobince

+1

[Đây là những gì tôi nghĩ lúc đầu khi đọc câu trả lời.] (Http://www.youtube.com/watch?v=TO5wryDdEI0) Tôi đã sử dụng tất cả upvotes của mình trong ngày; Tôi sẽ cố gắng nhớ trở lại sau bốn giờ nữa. – sdleihssirhc

Các vấn đề liên quan