Сообщение от repulsor
|
Значит развели over 9000 этих кодовых таблиц, а теперь простым трудягам в ручную писать?
|
Ну не так их уж и много.
Разрешенные в TextDecoder (кроме iso-2022-cn, iso-2022-cn-ext) тут
https://developer.mozilla.org/en-US/..._API/Encodings
Для простых кодировок (которые не китайско-японские и ограничиваются 256 кодами) можно прикрутить что то типа такого
<script>
class TextEncoderExt {
constructor (utfLabel="utf-8", options={fatal:false}) {
// options.fatal - true - выбрасывать исключение при ошибках кодирования.
// options.code - числовой код, который подставляется для несуществующих символов.
// если не указан, несуществующий символ пропускается.
if (utfLabel.toLowerCase().indexOf('utf')>=0) return new TextEncoder('utf-8', options)
this.codetable = {};
this.opt = options;
const arb = new Uint8Array(256)
for (let i = 0; i<256; i++) arb[i]=i;
const codestr = new TextDecoder(utfLabel).decode(arb);
for (let i=0; i<256; i++) this.codetable[codestr.codePointAt(i)] = i;
}
encode (str) {
const l = str.length;
const buf = new Uint8Array(l);
let j = 0;
for (let i = 0; i<l; i++) {
let v = this.codetable[str.codePointAt(i)];
if (v === undefined) {
if (this.opt?.fatal) throw new Error('EncodeExt error');
if (typeof this.opt?.code == 'number') v=this.opt.code & 255;
}
if (v !== undefined) buf[j++] = v;
}
return (j<l)? buf.slice(0,j) : buf;
}
}
const strin1="Это строка на кирилице. В “win-1251” и обратно …"
const buf1 = new TextEncoderExt('CP1251').encode(strin1)
const strout1= new TextDecoder('CP1251').decode(buf1)
console.log (strin1)
console.log (strout1)
const strin2="Это строка на кирилице. В “CP866” и обратно …"
const buf2 = new TextEncoderExt('866', {code:240}).encode(strin2) // Ё вместо несуществующих символов
const strout2= new TextDecoder('866').decode(buf2)
console.log (strin2)
console.log (strout2)
const strin3="Это строка на кирилице. В “utf-8” и обратно …"
const buf3 = new TextEncoderExt('utf-8').encode(strin3)
const strout3= new TextDecoder('utf-8').decode(buf3)
console.log (strin3)
console.log (strout3)
</script>