2012-08-02 2 views
11

나는이 멋진 코드를 얻었는데 왜 나는 작동하지 않는지 전혀 모른다. 호환성을 위해 문자 입력 값을 가져와 각 국가 별 문자를 HTML 코드로 대체해야합니다. 그러나 단추를 클릭하면 함수는 아무런 변경없이 문자열을 반환합니다. 아이디어가 있으십니까?자바 스크립트에서 문자열의 여러 문자 바꾸기

(jsfiddle)

<a id="reminder1" onclick="document.getElementById('reminder2').style.display = ''; document.getElementById('reminder1').style.display = 'none';"> 
    Set reminder 
</a> 
<a id="reminder2" class="reminder" style="display:none;"> 
    <input type="text" id="reminderh" size=40 style="font-size:20px;"> 
    <input type="button" value="Set" onclick="csere(document.getElementById('reminderh').value);"> 
</a> 

<script> 
function csere(qwe){ 
document.getElementById('reminder2').style.display = 'none'; 

var rtz0 = qwe.replace("á","&aacute;"); 
var rtz1 = rtz0.replace("Á","&Aacute;"); 

var rtz2 = rtz1.replace("é","&eacute;"); 
var rtz3 = rtz2.replace("É","&Eacute;"); 

var rtz4 = rtz3.replace("í","&iacute;"); 
var rtz5 = rtz4.replace("Í","&Iacute;"); 

var rtz6 = rtz5.replace("ö","&ouml;"); 
var rtz7 = rtz6.replace("Ö","&Ouml;"); 
var rtz8 = rtz7.replace("ő","&&#337;"); 
var rtz9 = rtz8.replace("Ő","&#336;"); 
var rtz10 = rtz9.replace("ó","&oacute;"); 
var rtz11 = rtz10.replace("Ó","&Oacute;"); 

var rtz12 = rtz11.replace("ü","&uuml;"); 
var rtz13 = rtz12.replace("Ü","&Uuml;"); 
var rtz14 = rtz13.replace("ű","&#369;"); 
var rtz15 = rtz14.replace("Ű","&#368;"); 
var rtz16 = rtz15.replace("ú","&uacute;"); 
var uio = rtz16.replace("Ú","&Uacute;"); 

//Creates a cookie with the final value (different function) 
createCookie('reminder',uio,1500); 

document.getElementById('reminder1').style.display = ''; 
} 
</script> 
+0

나를 위해 일한다 (나는'console.log'를 사용했다) – SomeKittens

+0

당신은 절대로 모든 교체를 한 후에 값을 다시 요소에 할당하지 않는다. – jbabey

+0

실제로 UTF 인코딩이 필요하지 않습니다. 전체 웹 사이트에서 사용하기 때문에 방금 사용했습니다. 꼭 필요한 것입니다. 기본적으로 국가 별 문자를 대체 할 코드가 필요하지 않습니다. – SeinopSys

답변

9

할 수 있습니다 단지 replace 모든 프로그램라는 엔티티를 사용하지 : (답변 @jackwanders에서 등)

return input.replace(/[^ -~]/g, function(chr) { 
//     ^^^^^^ 
// this is a regexp for "everything than printable ASCII-characters" 
// and even works in a ASCII-only charset. Identic: [^\u0020-\u007E] 
    return "&#"+chr.charCodeAt(0)+";"; 
}); 

당신이, 당신은 키 - 값 -지도이 결합 할 수 있습니다라는 엔티티를 사용하려는 경우를 :

var chars = { 
    "á" : "&aacute;", 
    "Á" : "&Aacute;", 
    "é" : "&eacute;", 
    "É" : "&Eacute;", 
    ... 
} 
return input.replace(/[^ -~]/g, function(chr) { 
    return (chr in chars) 
     ? chars[chr] 
     : "&#"+chr.charCodeAt(0)+";"; 
}); 

그러나, 당신은 자바 스크립트에서 HTML 엔티티를 사용할 필요가 없습니다 안됩니다. UTF8을 모든 문자 인코딩으로 사용하면 효과적입니다.

+0

@jackwanders 대답을 사용하여 코드의 두 번째 부분에서 어떻게 문자를 배치합니까? **/\ u00E1/** 형식을 사용하려고하면 오류가 발생합니다. – SeinopSys

+0

어디에서 사용합니까? 여전히 인코딩이 잘못 되었다면 맵 객체의 키를 이스케이프 처리해야합니다. – Bergi

1

당신은 문자의 첫 번째 인스턴스를 대체에 문제가있는 것 같아요.

var rtz0 = qwe.replace(new RegExp("á", "g"), "&aacute;"); 

그것은 PPvG 또는 jackwanders에서 언급 한 바와 같이 배열을 생성하는 가장 좋은 것입니다하지만, 그 이상이어야 기존 변수를 재사용 : 자바 스크립트에서이 같은 정규식을 사용하여 글로벌을 대체를에서 지정할해야합니다. 이 같은 그것을 할 쉽게 수 :

var chars = { 
    "á" : "&aacute;", 
    "Á" : "&Aacute;", 
    "é" : "&eacute;", 
    "É" : "&Eacute;", 
    ... 
} 

을 다음 .replace 호출 기능을 사용 : 각 문자 교체에 대한

qwe = qwe.replace(new RegExp("á", "g"), "&aacute;"); 
qwe = qwe.replace(new RegExp("Á", "g"), "&Aacute;"); 
+0

이것은 작동하지 않습니다. \ – SeinopSys

+0

내가 말했듯이이 방법은 다시 값을 반환하고 아무 것도하지 않습니다. – SeinopSys

+0

@ DJDavid98 나는 이것이 대체되지 않는 이유가 아닌 것 같아서 동의하지만, 내가 추천 한 것처럼 글로벌 대체를해야 할 것이다. 또한 PPvG 및 jackwanders에서 언급 한 배열을 사용하는 것이 좋습니다. –

9

당신은 키/값 쌍을 가진 개체를 만들 수

var uio = qwe.replace(/[áÁéÉ]/g,function(c) { return chars[c]; }); 

개체와 정규 표현식은 분명히 당신이

을 대체 할 모든 문자를 포함 할 성장해야합니다3210
3

문자는 HTML 페이지, JavaScript 페이지 및 HTTP 요청의 인코딩이 적용됩니다. 문자를 해당 유니 코드로 바꾸어보십시오.

<a id="reminder1" onclick="document.getElementById('reminder2').style.display = ''; document.getElementById('reminder1').style.display = 'none';"> 
    Set reminder 
</a> 
<a id="reminder2" class="reminder" style="display:none;"> 
    <input type="text" id="reminderh" size=40 style="font-size:20px;"> 
    <input type="button" value="Set" onclick="csere(document.getElementById('reminderh').value);"> 
</a> 

<script> 
function csere(qwe){ 
document.getElementById('reminder2').style.display = 'none'; 

var rtz0 = qwe.replace(/\u00E1/,"&aacute;"); 
var rtz1 = rtz0.replace(/\u00C1/,"&Aacute;"); 

var rtz2 = rtz1.replace(/\u00E9/,"&eacute;"); 
var rtz3 = rtz2.replace(/\u00C9/,"&Eacute;"); 

var rtz4 = rtz3.replace(/\u00ED/,"&iacute;"); 
var rtz5 = rtz4.replace(/\u00CD/,"&Iacute;"); 

var rtz6 = rtz5.replace(/\u00F6/,"&ouml;"); 
var rtz7 = rtz6.replace(/\u00D6/,"&Ouml;"); 
var rtz8 = rtz7.replace(/\u00F5/,"&&#337;"); 
var rtz9 = rtz8.replace(/\u00D5/,"&#336;"); 
var rtz10 = rtz9.replace(/\u00F3/,"&oacute;"); 
var rtz11 = rtz10.replace(/\u00D3/,"&Oacute;"); 

var rtz12 = rtz11.replace(/\u00FC/,"&uuml;"); 
var rtz13 = rtz12.replace(/\u00DC/,"&Uuml;"); 
var rtz14 = rtz13.replace(/\u0171/,"&#369;"); 
var rtz15 = rtz14.replace(/\u0170/,"&#368;"); 
var rtz16 = rtz15.replace(/\u00FA/,"&uacute;"); 
var uio = rtz16.replace(/\u00DA/,"&Uacute;"); 

//Creates a cookie with the final value (different function) 
createCookie('reminder',uio,1500); 

document.getElementById('reminder1').style.display = ''; 
} 
</script> 

변환을 확인하십시오. Wikibooks에 격자를 사용했습니다.

+0

예! 고맙습니다, 유니 코드로 대체 한 것처럼 보입니다. – SeinopSys

+1

이것이 해결책이라면 인코딩을 수정해야합니다. 어쨌든, 알고리즘을 개선하고 잭완 더의 대답을 보거나 광산을보아야합니다. – Bergi

+1

이것은 모든 문자의 첫 번째 인스턴스 만 대체합니다. 다음은 예제입니다 : http://jsfiddle.net/hHZhv/1 –

관련 문제