Heim >Backend-Entwicklung >PHP-Tutorial >关于Latin1编码在JS和php端不一致问题
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);//发送给php xmlhttp1.send(); document.write(xmlhttp1.responseText);
<?php $username_php=$_GET['sha1_html']; echo $username_php; echo '<br/>'; echo strlen($username_php); echo '<br/>'; echo bin2hex($username_php); echo '<br/>';?>
浏览器的工作字符集是 unicode
传入的任何字符集内容都将在浏览器中自动转换成 unicode
比如
$gbk = '中文';$utf8 = iconv('gbk', 'utf-8', $gbk);if(isset($_GET['ch'])) { echo "utf8 = '$utf8'; document.write(gbk == utf8);";}else { echo "<script>gbk = '$gbk';</script>"; echo "<script src=?ch=1 charset=utf-8></script>";}打印 true
浏览器的工作字符集是 unicode
传入的任何字符集内容都将在浏览器中自动转换成 unicode
感谢指导,我在PHP端将写成如下代码,则SS和JS端生成的sha1_html完全一样了,不过还是没太完全理解你的意思,你是说从浏览器端发送到PHP端的Latin1编码被自动转换成了UTF-8?所以我在PHP端将接收到的数据的编码模式由UTF-8转换成Latin1模式以后就正确了?
那么我还有个疑问,就是我echo $SS;返回到浏览器端的字符编码模式也会被自动转换为UTF-8,我需要再将其在浏览器端转换成Latin1模式?
我写了下面的php端代码
<?php $sh=$_GET['sha1'];$sh1=sha1("abc",true);$SS=iconv("UTF-8","ISO-8859-1",$sh); echo $SS; echo '<br/>'; echo strlen($SS); echo '<br/>'; echo bin2hex($SS); echo '<br/>';?>
不大理解你的疑问
浏览器会将收到的文本数据转成 unicode
浏览器在发送数据(比如表单提交)时会将 unicode 转成页面声明的字符集
如果你在 php 中按字节处理数据,那么要想得到和 js 处理相同的结果
需要将待处理的文字转成 ucs-2 字符集
不大理解你的疑问
浏览器会将收到的文本数据转成 unicode
浏览器在发送数据(比如表单提交)时会将 unicode 转成页面声明的字符集
如果你在 php 中按字节处理数据,那么要想得到和 js 处理相同的结果
需要将待处理的文字转成 ucs-2 字符集
<?php $sh=$_GET['sha1'];$a="abc";$sh1=sha1("abc",true);$SS=iconv("UTF-8","ISO-8859-1",$sh);if($SS==$sh1) echo "true"; echo $SS;?>