Heim  >  Artikel  >  Backend-Entwicklung  >  ajax - php端接收到的来自Javascript的Latin1编码长度变长了,转为16进制时发现多了0xC2,0xC3等

ajax - php端接收到的来自Javascript的Latin1编码长度变长了,转为16进制时发现多了0xC2,0xC3等

WBOY
WBOYOriginal
2016-06-06 20:20:371637Durchsuche

<code>
<script src="web/js/sha1.js" type="text/javascript"></script>
<script>
var sha1=CryptoJS.SHA1("abc");
document.write("sha1:",sha1);
document.write("<br>");
var sha1_Latin=sha1.toString(CryptoJS.enc.Latin1);
document.write("sha1_Latin:",sha1_Latin);
document.write("Latin.len:",sha1_Latin.length);
document.write("<br>");
var sha1_hex=strToHex(sha1_Latin);//此处为自己定义的一个函数,将字符串转换为ASCII的16进制形式
document.write("hex:",sha1_hex);
document.write("<br>");
var xmlhttp1;
if (window.XMLHttpRequest)
  {
  xmlhttp1=new XMLHttpRequest();
  }
else
  {
  xmlhttp1=new ActiveXObject("Microsoft.XMLHTTP");
  }
    xmlhttp1.open("GET","web/tes.php?sha1_html="+sha1_Latin,false);//发送G给服务器
    xmlhttp1.send();
    document.write(xmlhttp1.responseText);
</script>
</code>
<code><?php $username_php=$_GET['sha1_html'];
    cho "true";
    echo '<br/>';
    echo $username_php;
    echo '<br>';
    echo strlen($username_php);
    echo '<br>';
    echo bin2hex($username_php);
    echo '<br>';
?>
</code>

该代码JS端自主输出的
sha1_Latin:©™>6Gjº>%qxPÂlœÐ؝ / /此段为sha1(“abc”)生成的字符串
Latin.len:20
hex:a9993e364706816aba3e25717850c26c9cd0d89d//此段为sha1_Latin的16进制字符串形式,可以确定此处的hex转换是正确的

而通过AJAX传输到php后在浏览器端输出的
©™>6Gjº>%qxPÂlœÐ؝ //此处看着仍和前面的sha1_Latin对应
29//此处的长度不对应了
c2a9c2993e364706c2816ac2ba3e25717850c3826cc29cc390c398c29d//转换为16进制发现和前面的hex不一样,观察发现多了一些c2,c3,请问是为什么?????

回复内容:

<code>
<script src="web/js/sha1.js" type="text/javascript"></script>
<script>
var sha1=CryptoJS.SHA1("abc");
document.write("sha1:",sha1);
document.write("<br>");
var sha1_Latin=sha1.toString(CryptoJS.enc.Latin1);
document.write("sha1_Latin:",sha1_Latin);
document.write("Latin.len:",sha1_Latin.length);
document.write("<br>");
var sha1_hex=strToHex(sha1_Latin);//此处为自己定义的一个函数,将字符串转换为ASCII的16进制形式
document.write("hex:",sha1_hex);
document.write("<br>");
var xmlhttp1;
if (window.XMLHttpRequest)
  {
  xmlhttp1=new XMLHttpRequest();
  }
else
  {
  xmlhttp1=new ActiveXObject("Microsoft.XMLHTTP");
  }
    xmlhttp1.open("GET","web/tes.php?sha1_html="+sha1_Latin,false);//发送G给服务器
    xmlhttp1.send();
    document.write(xmlhttp1.responseText);
</script>
</code>
<code><?php $username_php=$_GET['sha1_html'];
    cho "true";
    echo '<br/>';
    echo $username_php;
    echo '<br>';
    echo strlen($username_php);
    echo '<br>';
    echo bin2hex($username_php);
    echo '<br>';
?>
</code>

该代码JS端自主输出的
sha1_Latin:©™>6Gjº>%qxPÂlœÐ؝ / /此段为sha1(“abc”)生成的字符串
Latin.len:20
hex:a9993e364706816aba3e25717850c26c9cd0d89d//此段为sha1_Latin的16进制字符串形式,可以确定此处的hex转换是正确的

而通过AJAX传输到php后在浏览器端输出的
©™>6Gjº>%qxPÂlœÐ؝ //此处看着仍和前面的sha1_Latin对应
29//此处的长度不对应了
c2a9c2993e364706c2816ac2ba3e25717850c3826cc29cc390c398c29d//转换为16进制发现和前面的hex不一样,观察发现多了一些c2,c3,请问是为什么?????

因为字符串被转码成别的编码了。你有没有发现前面添加c2c3的都是那些大于等于0x80的编码字符?

解决方法,设置页面编码、传输编码、PHP接收编码一致,都为Latin1,以防止浏览器或PHP自动转码

为什么不传 a9993e364706816aba3e25717850c26c9cd0d89d 这个字符串呢?

<code class="js">xmlhttp1.open("GET","web/tes.php?sha1_html="+sha1_hex,false);//发送G给服务器
xmlhttp1.send();
document.write(xmlhttp1.responseText);</code>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn