2014-11-04 7 views
0

나는 php와 javascript 모두에서 문자열을 처리하려고하고 있으며, 같은 동작을 원한다. 나는 이것을 구현하기 위해 php chr() 함수의 자바 스크립트 버전을 작성했다. 그러나 나는 uft-8 유니 코드 문제를 겪는다. 예를 들어, "a small b"한자를 사용하여 PHP에서 올바르게 수행 할 수 있지만 아래 코드를 사용하여 javascipt에서 실패하는 문자열을 만들려고합니다. 구현에 무엇이 잘못된 것인지 전문가에게 묻고 싶습니다.자바 스크립트 유니 코드 문자열을 PHP로 처리하는 방법은 무엇입니까?

출력은 다음과 같습니다 : 내가 사용

php str=a---- 
    php str=a�---- 
    php str=a��---- 
    php str=a大---- 
    php str=a大�---- 
    php str=a大��---- 
    php str=a大小---- 
    php str=a大小b---- 

    -------- 

    js str=a--- 
    js str=aå--- 
    js str=aå¤--- 
    js str=a大--- 
    js str=a大å--- 
    js str=a大å°--- 
    js str=a大å°--- 
    js str=a大å°b--- 

코드는 다음과 같습니다

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head> 
<body> 
<div class="container"> 

<?php 
    $string5 = "" ; 
    $str_a = chr(97) ; 
    $string5 .= $str_a ; echo "php str=$string5----<br>" ; 


    $str_c1 = chr(229) ; 
    $string5 .= $str_c1 ; echo "php str=$string5----<br>" ; 
    $str_c2 = chr(164) ; 
    $string5 .= $str_c2 ; echo "php str=$string5----<br>" ; 
    $str_c3 = chr(167) ; 
    $string5 .= $str_c3 ; echo "php str=$string5----<br>" ; 


    $str_cs1 = chr(229) ; 
    $string5 .= $str_cs1 ; echo "php str=$string5----<br>" ; 
    $str_cs2 = chr(176) ; 
    $string5 .= $str_cs2 ; echo "php str=$string5----<br>" ; 
    $str_cs3 = chr(143) ; 
    $string5 .= $str_cs3 ; echo "php str=$string5----<br>" ; 


    $str_b= chr(98) ; 
    $string5 .= $str_b ; echo "php str=$string5----<br>" ; 

    echo "<br><br>--------<br><br>" ; 
?> 


<script language = "JavaScript"> 

    function chr2(codePt) { 
     if (codePt > 0xFFFF) { 
     codePt -= 0x10000; 
     return String.fromCharCode(0xD800 + (codePt >> 10), 0xDC00 + (codePt & 0x3FF)); 
     } 
     return String.fromCharCode(codePt); 
    } 

    var string5 = "" ; 
    var str_a = chr2(97) ; 
    string5 += str_a ;  document.write("js str="+string5+"---<br>" ); 

    var str_c1 = chr2(229) ; 
    string5 += str_c1 ; document.write("js str="+string5+"---<br>" ); 
    var str_c2 = chr2(164) ; 
    string5 += str_c2 ; document.write("js str="+string5+"---<br>" ); 
    var str_c3 = chr2(167) ; 
    string5 += str_c3 ; document.write("js str="+string5+"---<br>" ); 


    var str_cs1 = chr2(229) ; 
    string5 += str_cs1 ; document.write("js str="+string5+"---<br>" ); 
    var str_cs2 = chr2(176) ; 
    string5 += str_cs2 ; document.write("js str="+string5+"---<br>" ); 
    var str_cs3 = chr2(143) ; 
    string5 += str_cs3 ; document.write("js str="+string5+"---<br>" ); 

    var str_b = chr2(98) ; 
    string5 += str_b ; document.write("js str="+string5+"---<br>" ); 

</script> 


</div> 
</body> 
</html 

답변

0

PHP와 자바 스크립트 문자열은 근본적으로 다르다. PHP 문자열은 일련의 바이트입니다. JavaScript 문자열은 일련의 문자입니다. (사실 UTF-16 코드 단위의 연속이지만이 예와 관련이 없습니다.)

은 U + 5927 (Han Ideograph Big)입니다. JavaScript로 생성하려면 String.fromCharCode(0x5927) (위의 도우미 함수를 사용하여 chr2(0x5927))을 사용합니다.

229, 164, 167은 UTF-8 인코딩 ("\xE5\xA4\xA7")을 사용하는 의 바이트 표현입니다. 바이트 순서의 중간에있는 문자를 분할하는 것은 유효하지 않으므로 PHP 출력에 오류가 발생합니다. 문자열 모델이 문자 기반이므로 중간에서 바이트 시퀀스를 분리 할 수 ​​없으므로 코드는 결코 동일하게 작동하지 않습니다.

+0

유익한 답변을 보내 주셔서 감사합니다. 웬일인지, 나는 자바 스크립트에서 문자열을 쪼개고 uincode 문자열을 되 찾아야한다. Javascript chr2() 함수 또는 js 코드를 수정하려면 어떻게해야합니까? – user2818066

+0

JavaScript 문자열 *은 유니 코드 문자열입니다. 그것은 유니 코드가 아닌 일련의 바이트 인 PHP 문자열입니다. JavaScript 문자열은 개별 바이트를 보유 할 수 없습니다. 'charCodeAt'가 UTF-8 바이트 단위를 나타내는 mangled (mojibake) 문자열을 얻고 싶다면'unescape (encodeURIComponent (s))'라는 관용적 인 트릭이 있습니다. 하지만 클라이언트 쪽에서 바이트를 만지는 일은 거의 없습니다. 브라우저는 유니 코드 중심 환경입니다. – bobince

+0

나는이 unicode 및 utf-8 문제에 새로운입니다. encodeURICompoent (s)를 사용하여 분할 된 유니 코드 단어를 연결하는 힌트를 얻을 수 없습니다. 이 개념을 사용하여 위의 코드를 변경하고 위의 Javascipt 코드에서 "a small b"문자열을 복구하는 방법. 감사! – user2818066