2016-02-04 8 views
8

ファイル名をエンコードし、/rest/get?name=Filename.txtのようにURLの一部として送信します。 JSでは、リンク構造がFirefoxでのencodeURIComponent()の動作が異なる

url = '/rest/get?name=' + window.encodeURIComponent(file.name); 

と同じくらい簡単です。これは単純な場合のために良い作品が、筋金入りのテストのために私は

你好abcABCæøåÆØÅäöüïëêîâéíáóúýñ½§!#¤%&()=`@£$€{[]}+´¨^~'-_,;.txt 

という名前のファイルを使用するURIのエンコード後、私はリンク

/rest/get?name=%E4%BD%A0%E5%A5%BDabcABC%C3%A6%C3%B8%C3%A5%C3%86%C3%98%C3%85%C3%A4%C3%B6%C3%BC%C3%AF%C3%AB%C3%AA%C3%AE%C3%A2%C3%A9%C3%AD%C3%A1%C3%B3%C3%BA%C3%BD%C3%B1%C2%BD%C2%A7%3F%3FabcABC%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD!%23%C2%A4%25%26()%3D%60%40%C2%A3%24%E2%82%AC%7B%5B%5D%7D%2B%C2%B4%C2%A8%5E~%27-_%2C%3B.txt 
を得ることを期待

そして私はそれを手に入れます。構築されたリンクは、IEとChromeの最新バージョンでは正常に動作しますが、Firefoxでは失敗します。いくつかの調査の後、私はFirefoxのencodeURIcomponentの動作が異なっていることを発見しました。ここでは、実際の結果は、Firefoxにあります:

/rest/get?name=%3F%3FabcABC%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD!%23%EF%BF%BD%25%26%28%29%3D%60%40%EF%BF%BD%24%3F{[]}%2B%EF%BF%BD%EF%BF%BD^~%27-_%2C%3B.txt 

ビジュアル比較(クロームリンクは左側にあり、Firefoxのリンクが右側にあります):

Comparison

私もコピー&ペーストしようとしましたFirefoxへの有効なリンク(Chromeで構築されています)は正常に動作します。

なぜ異なる結果が得られますか?
です。これAバグで̶̶̶e̶n̶c̶o̶d̶e̶U̶R̶I̶c̶o̶m̶p̶o̶n̶e̶n̶t̶(̶)̶にFirefoxの?̶
FirefoxはencodeURIComponent()で別のエンコーディングを使用していますか?

UPD。私は同様の質問(encodeURIComponent behaves differently in browsers for China as location [検索]と encodeURIComponent difference with browsers and ä-ö-å characters [ööå])を見つけましたが、どちらも答えはありません。

UPD.2詳しい調査の結果、以下の文字が異なって符号化し、原因となっていることが示されているサーバー上で例外 'が見つかりませんファイル':

  • ½§¤
    • 你好
    • æøåÆØÅäöüïëêîâéíáóúýñを
    • £€
    +0

    いずれかFireFoxのフォントマップが異なる場合、またはJavaScriptインタプリタのために使用するものは何でもFFそれが出ていること打撃の。 – durbnpoisn

    +1

    '%3F'は'? 'なので、ユニコードを正しく理解していないようです。 –

    +0

    @JamesThorpeはい、そうです。しかし、あなたが見ることができるように、URLの他の部分は、異なって符号化されています。私が '你好'を最初から削除すると、それはまだ失敗します。 – naXa

    答えて

    1

    I問題がencodeURIComponent()メソッドではないとします。それはどんな構造のコード化でもありますfile.name。あなたの質問を拡大してください。 file.nameはどのように初期化されますか?文字はどこから来たのですか?

    +0

    名前のファイルの一覧がサーバーから受信されます。 – naXa

    +1

    ですから、(JSデバッガを使用して)encodeURIComponent()に渡す直前のfile.nameに適切な文字(疑問符ではありません)が含まれていることを確認できますか? –

    +0

    @naXa確かに、devtoolsコンソールで 'encodeURIComponent("你好 ")'を試してください。期待どおり、 "%E4%BD%A0%E5%A5%BD"を返します。 – Nickolay

    -1

    encodeURIComponent()はネイティブ関数なので、Firefoxは明白にいくつかの異なる実装をカバーの下で使用しています。

    あなたが抱えている場合は、encodeURIComponent()の独自のjavascript実装を提供するだけで、ブラウザ間で同じ結果が得られます。ここにリンクは、オープンソースのコピーを取得する方法は次のとおりです。

    encodeURIComponent algorithm source code私はそれがあることを推測するつもりだ

    関連する問題