2011-08-17 4 views
14

캔버스 fillText을 사용하여 글꼴에 특수 문자를 표시하고 싶습니다. 코드는 기본적으로 :유니 코드 문자로 캔버스 채우기 문자를 이해하는 데 문제가 있습니다.

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

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

context.fillText(hexstring,100,100); 

내가 처음 hexstring를 사용하는 경우, 그것은 작동하고 I는 저작권 기호를 얻을. 두 번째 것을 사용하면 \u00A9 만 표시됩니다. 숫자를 반복해야하므로 두 번째 글꼴을 사용하여 글꼴의 모든 특수 문자를 표시해야합니다. 나는 utf-8을 사용하고있다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

27

사용 String.fromCharCode 숫자를 문자로 설정하는 . 당신이 진수로 인코딩 된 문자열이있는 경우

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

당신이 먼저 16 진수로 그 구문을 분석 할 수 있습니다

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

문자의 범위를 포함하는 문자열을 만들려면, 당신은 숫자의 배열을 만들 수 있습니다 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 다시 내 구조에 온다. 고마워. –

0

작업 예를

http://jsfiddle.net/sbYPj/

평가 시간 :

으로 반복 납입을 통해

이 작동합니다 잘

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

.... – samccone

+1

실행 취소 정규식 검사가 즉시 취약점을 제거하지만, 여전히'eval'가 느린 추한, 위험하고 있기 때문에 downvote [보통] (HTTP : // 유래 .com/questions/86513/why-is-use-javascript-eval-function-a-bad-idea)를 피하는 것이 가장 좋습니다. – bobince

+1

[이것은 내가 처음 대답을 읽었을 때 처음 생각한 것입니다.] (http://www.youtube.com/watch?v=TO5wryDdEI0) 하루 동안 모든 상영 시간을 사용했습니다. 4 시간 후에 다시 기억할 것입니다. – sdleihssirhc

관련 문제