ホームページ >バックエンド開発 >PHPチュートリアル >JS側とPHP側のLatin1エンコーディングの不一致について

JS側とPHP側のLatin1エンコーディングの不一致について

WBOY
WBOYオリジナル
2016-06-20 12:39:591509ブラウズ

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/>';?>  




sha1_Latin: // このセクションは、sha1 ("abc")、CSDN によって生成された文字列です。プロンプトには特殊な記号があり、ここでの出力は省略されています
Latin.len:20
hex:a9993e364706816aba3e25717850c26c9cd0d89d//このセクションは sha1_Latin の 16 進文字列形式であることを確認できます。


AJAX 経由で php に送信された後、ブラウザ側で出力されます //これは以前の sha1_Latin に対応しており、特殊記号があることを示す CSDN プロンプトがあり、ここでの出力は省略されています
29//これの長さは
c2a9c2993e364706c2816ac2ba3e25717850c3826cc29cc390c398c29d に対応しません。16 進数に変換すると、前の 16 進数と異なることがわかりました。なぜですか。 ? ? ? ?


ディスカッションへの返信 (解決策)

ブラウザの動作文字セットは 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モードに変換すれば正しくなるでしょうか?
それではまだ質問があります。つまり、$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;?> 

受け取ったshをSSに変換した後、 true と出力できるのですが、echo $ を変更しました。SS がブラウザ側に戻ると var mm=xmlhttp1.responseText.substring(4); mm が JS 側の sha1 と異なるように見えます (変換された 16 進数の文字列も異なります)。あなたの指示に従い、これを変更しました。mmはUnicodeモードとして認識し、Latin1エンコーディングに変換しようとしましたが、結果は成功しませんでした。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。