14

सबसे पहले, मैं इस सवाल के बारे में पता कर रहा हूँ:जावास्क्रिप्ट, अजाक्स, आईई से बाइनरी डेटा तक पहुंच: प्रतिक्रिया प्रतिक्रिया जावास्क्रिप्ट (वीबी नहीं) से पढ़ी जा सकती है?

और विशेष रूप से सर्वश्रेष्ठ उत्तर उसमें, http://emilsblog.lerch.org/2009/07/javascript-hacks-using-xhr-to-load.html

इसलिए फ़ायरफ़ॉक्स का उपयोग करके जावास्क्रिप्ट से बाइनरी डेटा तक पहुंच (और क्रोम के बाद के संस्करण जो वास्तव में काम करने लगते हैं; ओपेरा के बारे में नहीं जानते)। अब तक सब ठीक है। लेकिन मैं अभी भी एक आधुनिक आईई (आदर्श आईई 6, लेकिन कम से कम आईई 7+) के साथ बाइनरी डेटा तक पहुंचने का तरीका ढूंढने की उम्मीद कर रहा हूं, वीबी का उपयोग किए बिना। यह उल्लेख किया गया है कि XHR.messageBody काम नहीं करेगा (यदि इसमें शून्य बाइट्स हैं), लेकिन मैं सोच रहा था कि यह नए संस्करणों के साथ हल हो गया है; या यदि वैकल्पिक सेटिंग्स हो सकती हैं जो साधारण बाइनरी डेटा पहुंच की अनुमति देगी।

मेरे लिए विशिष्ट उपयोग केस एक वेब सेवा द्वारा लौटाए गए डेटा तक पहुंचने का है जो बाइनरी डेटा ट्रांसफर प्रारूप (यूटीएफ -8 एन्कोडिंग में कानूनी नहीं है) सहित एन्कोड किया गया है।

उत्तर

1

मैं (करने के लिए/चल अंक द्विआधारी आईईईई प्रतिनिधित्व से संभाल करने के लिए) अनुमान है कि उत्तर इस पोस्ट के अनुसार सादा "नहीं" है: how do I access XHR responseBody (for binary data) from Javascript in IE?

(या: "वीबीस्क्रिप्ट का उपयोग करने के लिए पी ")

3

ठीक है, मुझे कुछ रोचक लीड मिली हैं, हालांकि अभी तक पूरी तरह से अच्छा समाधान नहीं है।

मैंने कोशिश की एक स्पष्ट बात एन्कोडिंग के साथ खेलना था। वहाँ 2 स्पष्ट चीजें हैं जो वास्तव में काम करना चाहिए रहे हैं:

  • लैटिन -1 (उर्फ ISO-8859-1): यह एकल-बाइट एन्कोडिंग, मानचित्रण एक-से-एक यूनिकोड के साथ है। इसलिए सैद्धांतिक रूप से यह "टेक्स्ट/सादा; वर्णसेट = आईएसओ -885 9 -1" सामग्री प्रकार घोषित करने के लिए पर्याप्त होना चाहिए और चरित्र-प्रति-बाइट प्राप्त करें। हां, ब्राउज़रों के बेवकूफ तर्कों के कारण (और एचटीएमएल 5 द्वारा और भी बेवकूफ जनादेश!), कुछ ट्रांसकोडिंग घटनाएं हैं जो अजीब तरीके से उच्च नियंत्रण चरित्र सीमा (कोड 128 - 15 9) को बदलती हैं। जाहिर है यह अनिवार्य धारणा के कारण है कि वास्तव में एन्कोडिंग विंडोज -1252 है (क्यों? कुछ मूर्ख कारणों के लिए .. लेकिन यह वही है)
  • यूसीएस -2 एक निश्चित लंबाई 2-बाइट एन्कोडिंग है जो यूटीएफ -17 की भविष्यवाणी करता है ; और बस 16-बिट वर्ण कोड को 2 बाइट्स में विभाजित करता है। हां, ब्राउज़र इसका समर्थन नहीं करते हैं।
  • यूटीएफ -16 सैद्धांतिक रूप से काम कर सकता है, लेकिन सरोगेट जोड़ी वर्ण (0xD800 - 0xDFFF) की समस्या है जो आरक्षित हैं। और यदि बाइट जोड़े जो इन पात्रों को एन्कोड करते हैं, भ्रष्टाचार होता है।

हालांकि: ऐसा लगता है कि लैटिन -1 के लिए रूपांतरण उलटा हो सकता है, और यदि ऐसा है, तो मैं शर्त लगाता हूं कि मैं इसका उपयोग कर सकता हूं। सभी उत्परिवर्तन 1 बाइट (0x00 - 0xFF) से बड़े-बाइट मानों में हैं, और कम से कम फ़ायरफ़ॉक्स के लिए कोई संदिग्ध मैपिंग नहीं हैं। यदि यह अन्य ब्राउज़रों के लिए सच है, तो मूल्यों को वापस मैप करना और स्वचालित ट्रांसकोडिंग के दुष्प्रभावों को दूर करना संभव होगा। और फिर आईई सहित कई ब्राउज़रों के लिए काम करेगा (शून्य मूल्यों से निपटने के लिए कुछ विशेष की आवश्यकता के चेतावनी के साथ)।

अंत में, डेटाटाइप्स के रूपांतरण के लिए कुछ उपयोगी लिंक कर रहे हैं:

2

आप JScript उपयोग कर सकते हैं" VBArray "वस्तु (VBScript का उपयोग किए बिना IE में इन बाइट्स पर प्राप्त करने के लिए):

var data = new VBArray(xhr.responseBody).toArray();

+1

नहीं, मैं इस काम करता है नहीं लगता कि था। मेरे अनुभव में, मुझे इस लाइन को निष्पादित करते समय अपवाद मिलता है; यह शिकायत करता है कि प्रतिक्रिया बॉडी एक VBArray नहीं है। VBArray के लिए प्रलेखन जो आपने लिंक किया है * सुरक्षितअरे तर्क ने VBArray कन्स्ट्रक्टर को पारित होने से पहले एक VBArray मान प्राप्त किया होगा। यह केवल मौजूदा ActiveX या अन्य ऑब्जेक्ट से मान पुनर्प्राप्त करके किया जा सकता है। * लेकिन प्रतिक्रिया के लिए दस्तावेज़ बॉडी http://msdn.microsoft.com/en-us/library/ms534368(VS.85).aspx इंगित नहीं करता है कि यह एक सुरक्षित ऐरे है। – Cheeso

3

यह का उपयोग कर responseType = arraybuffer या ब्लॉब, IE10 साथ संभव है। आप केवल एक कुछ वर्षों के लिए प्रतीक्षा करने के लिए ...

http://msdn.microsoft.com/en-us/library/ie/br212474%28v=vs.94%29.aspx

http://msdn.microsoft.com/en-us/library/ie/hh673569%28v=vs.85%29.aspx

+0

संभवतः यह एक आईई-केवल समाधान होगा? कम से कम यह आईई पर अन्य तरीकों की तुलना में थोड़ा क्लीनर होगा, और इस तरह के एक सुधार के रूप में। – StaxMan

+0

यह अन्य हालिया ब्राउज़रों में काम करता है: https://developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays/ArrayBuffer#Browser_compatibility – Damien

+0

आह, बढ़िया! धन्यवाद। – StaxMan

संबंधित मुद्दे