2009-11-25 12 views
8

Ich versuche URL-Escape (Prozent-Encode) Nicht-ASCII-Zeichen in mehreren URLs, mit denen ich es zu tun habe. Ich arbeite mit einer Flash-Anwendung, die Ressourcen wie Bilder und Soundclips von diesen URLs lädt. Da die Dateinamen Nicht-ASCII-Zeichen enthalten kann, etwa so: 日本語.jpg ich entkommen sie von utf-8 die Zeichen codiert, und dann Prozent-escaping die Unicode-Bytes, erhalten folgendes:URL Escaping Chinesisch/Japanisch Unicode-Zeichen für Internet Explorer

%E6%97%A5%E6%9C%AC%E8%AA%9E.jpg

Diese Dateinamen funktionieren einwandfrei, wenn ich die App in einem anderen Browser als dem Internet Explorer ausführe - ich habe Firefox, Safari und Chrome ausprobiert. Aber wenn ich die App in IE starten (versucht, beide 6 und 8) und es versucht, den Soundclip zu laden, erhalte ich: Error #2044: Unhandled ioError und die URL beschädigt wurde, so etwas wie:

æ¥æ¬èª.jpg

Irgendwelche Gedanken darüber, wie das zu beheben ist? Dies ist nur ein Test für die Flash-App mit lokalen Dateisystem-URLs. Ich habe auch bemerkt, dass Internet Explorer nicht in der Lage ist, eine Datei wie zu suchen: file:///C:/%E6%97%A5%E6%9C%AC%E8%AA%9E.jpg, obwohl Chrome/Firefox wird dekodieren und Last gut für eine Datei mit dem

Pfad

C:\日本語.jpg

bearbeiten

ich glaube, mein Problem ist das gleiche wie das in dem folgende Actionscript-Codefragment gestoßen ist:

import flash.display.Loader; 
import flash.net.URLRequest; 
... 
var ldr:Loader; 
var req:URLRequest = new URLRequest("日本語.jpg"); 
ldr = new Loader(); 
ldr.load(req); 

Die Verwendung der Zeichenfolge 日本語.jpg funktioniert im IE, während die Verwendung der Zeichenfolge %E6%97%A5%E6%9C%AC%E8%AA%9E.jpg in anderen Browsern funktioniert. Was ich brauche, ist ein einzelnes Formular, das in allen Browsern funktioniert. Ich habe versucht, die %u Kodierung und die HTTP-Anfrage Header auf Content-Type: text/html; charset=utf-8 ohne Glück in entweder Prozent-Escape oder Unescaped-Form.

+0

Windows verwendet UTF-16 für Dateinamen. Also versuchen Sie% 65% E5% 67% 2C% 8A% 9E'. – Gumbo

+0

Keine Würfel mit dem UTF-16-Namen, IE konnte es immer noch nicht finden. – Bear

+0

verwandt: http://stackoverflow.com/questions/75980/best-practice-escape-or-codeuri-encodeuricomponent – cregox

Antwort

1

Sorry, keine Lösung, aber vielleicht noch ein paar mehr Informationen darüber, was hier vor sich geht. (Wahrscheinlich haben Sie schon so viel herausgefunden, aber vielleicht hilft es einem anderen Leser, eine Lösung zu finden.) Die "offizielle" URL-Kodierungsspezifikation scheint die Tür weit offen zu lassen, wie entgangene URLs wie die, die Sie erzeugen, entschlüsselt werden - Sind die Escape-Entities UTF-8-Zeichen (wie Firefox usw. interpretiert) oder ASCII-Zeichen (wie IE sie interpretiert) darzustellen? Ich kenne keine Möglichkeit, die beabsichtigte Dekodierungsstrategie zu erzwingen.

Nur eine Frage: was Schlimmes passiert, wenn Sie ihnen überhaupt nicht entkommen, aber lassen Sie den Unicode in der URL? Obwohl ich nicht viel Erfahrung damit habe, dachte ich, ich erinnere mich, irgendwo gelesen zu haben, dass die Tage, in denen wir Unicode in URLs entkommen mussten, hinter uns liegen. Könnte falsch sein ...

+0

Die meisten Browser scheinen ok mit URLs mit Unicode-Zeichen. Ich baue jedoch eine Flex-Anwendung, und meine URLs sind Links zu externen Assets wie Soundclips, Bildern, Filmen usw. Wenn ich die kompilierte SWF-Datei im Flash-Plug-in ausführe, werden diese Assets nur geladen, wenn Unicode-Zeichen vorhanden sind URL/Prozent entkamen UTF-8. Sonst können sie nicht geladen werden. Diese mit Prozentzeichen versehenen Dateinamen funktionieren in jedem Browser mit Ausnahme von Internet Explorer. – Bear

+0

URI/URL (RFC 3986) erfordert die Codierung von Nicht-ASCII-Zeichen. IRI (RFC 3987) hingegen erlaubt die meisten Unicode-Zeichen uncodiert. IRI ist der neue Standard, der den alten URI/URL-Standard ersetzt, aber viele Systeme implementieren IRI noch nicht. Die IRI-Spezifikation enthält Regeln zum Konvertieren einer IRI in eine URI/URL und umgekehrt. –

1

IE verwendet UTF-8 für HTTP-URLs, aber ich bin mir nicht sicher über Datei-URLs (obwohl ich das Verhalten als Teil des IE-Teams vor etwa 10 Jahren getestet). Wenn Sie die URLs in HTML verwenden, empfehle ich tatsächlich String-Literale (wenn Ihre Seitencodierung UTF-8 ist) oder numerische Zeichenreferenzen (& #dddd;). IE konvertiert im Allgemeinen die Zeichen in eine geeignete Codierung, die UTF-8 für das HTTP-Zeugs und UTF-16 für lokale Dateisysteminteraktionen sein würde.

Es ist eigentlich HTTP, die URL-Escaping benötigt, nicht den HTML-Parser.

1

Versuchen Sie, nur die Teile des URI zu codieren, die eine falsche Analyse verursachen würden. Codieren Sie zum Beispiel &,?, Und Leerzeichen. Lass alles andere wie es ist und es sollte wie ein Zauber wirken.

Wenn weiterhin Probleme auftreten, müssen Sie den Inhaltstyp möglicherweise in Ihren http-Headern auf utf setzen. So etwas wie Inhaltstyp: text/html; Zeichensatz = UTF-8.

+0

Leider arbeitet das Framework, mit dem ich arbeite - Flex - nicht besonders gut mit nicht-gescannten, nicht-ASCII-Zeichen. Ich muss herausfinden, ob es einen richtigen Weg gibt. Ich werde im Flex-Framework nachsehen, ob es möglich ist, auf die HTTP-Header zuzugreifen, aber ich habe auf eine Lösung auf höherer Ebene gehofft. – Bear

1

Warum nicht einfach Unicode-Escape-Sequenzen verwenden? Fügen Sie diese in einen Körper eines HTML-Web-Seite zu sehen, was ich meine:

<script type="text/javascript"> 
     var fileName = "日本語.jpg"; 
     document.write(escape(fileName)); 
    </script> 

I% u65E5% u672C% u8A9E.jpg erhalten.

+0

Diese funktionieren leider nicht für mich. Ist dies eine Standardmethode zum Entkommen von URLs? Firefox konnte keine URL des folgenden Formats laden: 'file: ///.../% u3400.jpg', für eine Datei namens' 㐀 .jpg' auf dem angegebenen Pfad. – Bear

+0

Sorry, ich denke, es funktioniert nur für JavaScript Escape/Unescape. Ich habe versucht, Ihre Codierung, und es funktioniert für meine localhost. Wie an anderer Stelle erwähnt, müssen Sie möglicherweise dem Server, an den Sie UTF-8 senden, in einer Kopfzeile mitteilen. – Ishmael

+0

Wenn Ihre Host-Seite ein Encoding-Meta-Tag hat, sollte das ausreichen, um den Server zu überzeugen, dass Sie UTF-8 sprechen. Ich würde denken. Könnte sein. – Ishmael

1

Von dem, was ich getestet habe, bemerkte ich, IE behandelt nicht codierte Datei-URLs, aber es behandelt normale HTTP-URLs, so dass das Problem sein könnte. Ich bin mir nicht sicher, wie Sie sie laden, aber Sie sollten dieses Problem überprüfen.

+0

Dies erweist sich als das Problem. Das Flash-Active-X-Steuerelement (IE) lädt nur nicht codierte Datei-URLs, während das Flash-Plug-In (Chrome, Firefox, Safari usw.) nur codierte Datei-URLs lädt. Die einzige Abhilfe, die ich habe in der Lage gewesen, so weit zu denken ist: wenn Flash-Player aktiv-x Verwendung unverschlüsselter url sonst Verwendung URL-codiert url ein bisschen hacky, wenn Sie mich fragen. – Bear

1

Datei: // Das Protokoll hängt von den Einstellungen Ihrer Betriebssystemregion ab. Wenn Ihre Systemeinstellungen nicht auf Chinesisch, sondern auf Englisch eingestellt sind, können Sie dies nicht tun.