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

WBOY
Freigeben: 2016-06-06 20:20:37
Original
1596 Leute haben es durchsucht

<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>
Nach dem Login kopieren
Nach dem Login kopieren
<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>
Nach dem Login kopieren
Nach dem Login kopieren

该代码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>
Nach dem Login kopieren
Nach dem Login kopieren
<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>
Nach dem Login kopieren
Nach dem Login kopieren

该代码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>
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!