Text EnderとText DecoderはIEの下で互換性がない問題を解決します.
3203 ワード
一、問題が発生する
プロジェクトではバージョンの問題でstomp.jsをアップグレードしなければなりません.しかし、stomp.jsパッケージ内部で使用されるTextEnccoderとText Decoderは、IEの下では互換性がない.全体のプロジェクトはIEの下で走れなくなりました.互換性は入り口を見ます.
二、解決の試み
text-encoding.js
npmで互換ライブラリtext-encoding.jsを見つけました.これはgithubです. ここはnpmリンクアドレスです.残念なことに、この二つはもうメンテナンスを停止しました.会社もオープンソースとして導入することができなくて、放棄しました.もちろん、皆さんの要求はそんなに厳しくないです.完全に使えます.
自分でtext-encoding.jsを書きます.
Stop.jsのソースコードを研究しています.TextEncoderはIEの下で互換性がありませんが、stompではText Encocderの最も基本的なコードだけが使われています.すなわち、utf-8:
転載先:https://blog.csdn.net/qq_29722281/articale/detail/107202540
プロジェクトではバージョンの問題でstomp.jsをアップグレードしなければなりません.しかし、stomp.jsパッケージ内部で使用されるTextEnccoderとText Decoderは、IEの下では互換性がない.全体のプロジェクトはIEの下で走れなくなりました.互換性は入り口を見ます.
二、解決の試み
text-encoding.js
npmで互換ライブラリtext-encoding.jsを見つけました.これはgithubです. ここはnpmリンクアドレスです.残念なことに、この二つはもうメンテナンスを停止しました.会社もオープンソースとして導入することができなくて、放棄しました.もちろん、皆さんの要求はそんなに厳しくないです.完全に使えます.
自分でtext-encoding.jsを書きます.
Stop.jsのソースコードを研究しています.TextEncoderはIEの下で互換性がありませんが、stompではText Encocderの最も基本的なコードだけが使われています.すなわち、utf-8:
//--TextEncoder
// 2. Set enc's encoding to UTF-8's encoder.
if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) {
// NONSTANDARD behavior.
label = label !== undefined ? String(label) : DEFAULT_ENCODING;
let encoding = getEncoding(label);
if (encoding === null || encoding.name === 'replacement') {throw RangeError('Unknown encoding: ' + label);}
if (!encoders[encoding.name]) {
throw Error('Encoder not present.' +
' Did you forget to include encoding-indexes.js first?');
}
enc._encoding = encoding;
}
DEFAULT_ENCODING
は、utf−8符号化である.utf-8だけのコードに対しては、ブラウザ対応のunescape
とencodeURIComponent
を使用して、シミュレーションを行うことができます.var encoder = new TextEncoder();
encoder.encode(" abc");
//result : Uint8Array(9) [228, 184, 173, 230, 150, 135, 97, 98, 99]
unescape(encodeURIComponent(" abc")).split("").map(val => val.charCodeAt());
//result : (9) [228, 184, 173, 230, 150, 135, 97, 98, 99]
同様に、復号は以下の通りである.var decoder = new TextDecoder();
decoder.decode(Uint8Array.from([228, 184, 173, 230, 150, 135, 97, 98, 99]));
//result : abc
decodeURIComponent(escape(String.fromCharCode(...[228, 184, 173, 230, 150, 135, 97, 98, 99])));
//result : abc
したがって、IEに対応するために、ES 5で以下のようにカプセル化する./**
* @description 。 stomp textEncoder textDecoder IE
* stomp utf8 , ie unescape encodeURIComponent
* @param {type}
* @Date 2020-07-08 11:45:19
*/
(function(window) {
if(typeof TextEncoder=="function") {return;}
function _TextEncoder() {
//--DO NOTHING
}
_TextEncoder.prototype.encode = function(s) {
//return unescape(encodeURIComponent(s)).split('').map(function(val) {return val.charCodeAt();});
var data=unescape(encodeURIComponent(s)).split('').map(function(val) {return val.charCodeAt();});
return typeof Uint8Array=="function"?new Uint8Array(data):data;//new TextEncoder().encode Uint8Array
};
function _TextDecoder() {
//--DO NOTHING
}
_TextDecoder.prototype.decode = function(code_arr) {
return decodeURIComponent(escape(String.fromCharCode.apply(null, code_arr)));
};
window.TextEncoder = _TextEncoder;
window.TextDecoder = _TextDecoder;
})(this);
直接引用してください.転載先:https://blog.csdn.net/qq_29722281/articale/detail/107202540