2011-12-14 7 views
2

"ランダム" 128バイト鍵を生成する必要があります(ランダム性の強さは現時点では重要ではありません)。私は次のコードでJavaScriptでこれを行う:私はPOSTを経由してPHPスクリプトにこのキーを送信すると、しかしJavascriptとPHPでは文字エンコーディングが異なりますか?

var buffer = ""; 
for(var i=0; i<128; i++) 
{ 
    buffer += String.fromCharCode(Math.round(Math.random()*255)); 
} 

、私は私のキーに特定の文字が同じエンコーディングを持っていないことがわかります!例えば、私がJavascriptでòのエンコーディングを出力すると、私は254を取得しますが、同じ文字はPHPで195のエンコーディングを持ちます。

A-Z、a-z、および0-9などの特定の文字は、JavascriptとPHPの両方で同じエンコードを使用します。

文字コードを出力するには、Javascriptの.charCodeAt()メソッドとPHPのord()関数を使用します。

文字エンコーディングが異なる理由を誰かが私に説明できると思っていました。ありがとうございました!

+0

、 '127'は、PHPのバイトのcharという概念のために作業するのが最も簡単なはずです。 – alex

答えて

7

Javascripts .charCodeAt()は、各文字列のUnicodeコードポイントを返します。 Javascriptの文字列は、UCS-2またはUTF-16を使用します。

PHPは文字列をバイトストリームとして扱います。それは実際には文字セットの多くを知らない。基本的には、デフォルトの文字列はASCIIまたはLatin-1とみなされます。

URLまたはフォームの値を使って転送されるパラメータは、通常、UTF-8としてエンコードされます。 UTF-8はその存在を知らないシステムで動作するように特別に設計されているため、PHPで動作します。

òのUTF-8エンコードは、"\xC3\xB2"です。だから、$string[0]でPHPの最初の文字にアクセスすると、最初のバイトが表示されます。これは16進数C3または10進数195です。

PHPには、mb_string関数がありますが、必要に応じてUTF-8などを扱うことができます。あなたは255個の別の文字を必要としない場合(ここではこの問題を回避するには、UCS-2にUTF-8から文字列を変換してからUnicodeコード・ポイントを取得するための最初の単語を抽出することである。あるいは、How to get code point number for a given character in a utf-8 string?ようlongwindedアプローチ)

+1

華麗な答え。 – alex

+0

最高の部分は、私はすべてでそれを学んだです。 – mario

+0

この素晴らしい答えに感謝して忘れてしまった。再度、感謝します! – Jules

関連する問題