2016-02-04 13 views
8

Ich kodiere einen Dateinamen und sende es als Teil einer URL wie /rest/get?name=Filename.txt. In JS Link Aufbau so einfach wieUnterschiedliches Verhalten von encodeURIComponent() in Firefox nur

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

Es ist für einfache Fälle gut funktioniert, aber für Hardcore-Test verwende ich eine Datei

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

Nach URI-Kodierung genannt Ich erwarte einen Link

/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 
zu erhalten

Und ich verstehe es. Der konstruierte Link funktioniert in den neuesten Versionen von IE und Chrome einwandfrei, schlägt aber in Firefox fehl. Nach einigen Untersuchungen habe ich festgestellt, dass in Firefox encodeURIcomponent anders funktioniert. Hier tatsächliche Ergebnis in 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 

Visueller Vergleich (Chrome-Link ist auf der linken Seite und Firefox Link auf der rechten Seite):

Comparison

Ich habe auch zu kopieren und versucht die gültiger Link (in Chrome erstellt) zu Firefox und es funktioniert ok.

Warum bekomme ich unterschiedliche Ergebnisse?
Ist es ein Fehler mit ̶ ̶e̶n̶c̶o̶d̶e̶U̶R̶I̶c̶o̶m̶p̶o̶n̶e̶n̶t̶(̶)̶ ̶ FireFox? ̶
Firefox eine andere Codierung in encodeURIComponent() verwenden Hat?

UPD. Ich habe ähnliche Fragen (encodeURIComponent behaves differently in browsers for China as location [搜索] und encodeURIComponent difference with browsers and ä-ö-å characters [äöå]), beide ohne Antwort gefunden.

UPD.2 Weitere Untersuchungen haben gezeigt, dass die folgenden Zeichen unterschiedlich codiert und verursacht auf Server Ausnahme 'Datei nicht gefunden':

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

Ich werde erraten, dass es entweder, dass die FireFox Schrift Karte ist anders, oder dass das, was FF für ein JavaScript-Interpreter verwendet, ist aus von whack. – durbnpoisn

+1

'% 3F' ist'? ', Also sieht es so aus, als würde man den Unicode nicht richtig verstehen. –

+0

@JamesThorpe ja, du hast Recht. Aber wie Sie sehen können, ist der andere Teil von URL auch anders kodiert und wenn ich '你好' von Anfang an lösche, schlägt es immer noch fehl. – naXa

Antwort

1

I Angenommen, Ihr Problem ist nicht die Methode encodeURIComponent(). Es ist die Kodierung von allen Konstrukten file.name. Erweitere deine Frage. Wie wird file.name initialisiert? Woher kommen die Zeichen?

+0

Eine Liste der Dateien mit ihren Namen wird vom Server empfangen. – naXa

+1

also, können Sie sicherstellen (mit JS Debugger), dass file.name, vor dem übergeben an encodeURIComponent(), enthält richtige Zeichen (und keine Fragezeichen)? –

+0

@naXa Versuchen Sie 'encodeURIComponent (" 你好 ")' in der Devtools-Konsole, es gibt "% E4% BD% A0% E5% A5% BD", wie Sie es erwarten. – Nickolay

-1

encodeURIComponent() ist eine native Funktion, daher verwendet Firefox offensichtlich verschiedene Implementierungen unter den Covern.

Wenn Sie stecken bleiben, dann liefern Sie einfach Ihre eigene Javascript-Implementierung von encodeURIComponent(), dann erhalten Sie die gleichen Ergebnisse über die Browser. Hier ist ein Link, wie eine Open-Source-Kopie davon zu bekommen:

encodeURIComponent algorithm source code

Verwandte Themen