Нет определенного способа сделать это.
Согласно спецификации, получить класс c рабочий импортированный скрипт должен прочитать выбранные данные как UTF-8:
(То же относится и к для выбор классного c рабочего сценария btw)
Это не оставляет места для сомнений. Даже установка charset в заголовке Content-Type здесь не поможет (хотя она должна для выборка classi c сценариев ).
Теперь, кажется, Chrome не соблюдает это правило (по крайней мере, не для data: // URL, я не пробовал с реальным обслуживаемым файлом, и для blob: // URL, которые они не ' даже смотреть на определенный набор символов ...), но Firefox делает.
// we store the text encoded as base64 to preserve the encoding
// original text is `postMessage("é and ü")`
const script_url = "data:text/javascript;charset=windows-1252;base64,cG9zdE1lc3NhZ2UoIukgYW5kIPwiKQ==";
// importScript() test
{
const worker_script = `importScripts( "${ script_url }" );`;
const import_worker = new Worker( URL.createObjectURL( new Blob( [ worker_script ], { type: "text/javascript" } ) ) );
import_worker.onmessage = (evt) => {
console.log( 'importScripts:', evt.data );
};
}
// Worker script test
{
const direct_worker = new Worker( script_url );
direct_worker.onmessage = (evt) => {
console.log( 'worker script:', evt.data );
};
}
// inline script test
{
const script = document.createElement( 'script' );
script.src = script_url;
document.head.append( script );
onmessage = (evt) => {
console.log( 'inline-script:', evt.data );
};
}
Конечно, есть способы обойти это:
- Определенно лучшее решение - перекодировать ваши сценарии как UTF-8.
- Еще одно совершенно хакерское решение - извлечь ваш сценарий как BLOB-объект, прочитать его как DOMString, используя правильную кодировку, а затем сгенерировать новый UTF-8 BLOB-объект, который вы бы хотели служить
importScripts
. выполнимо , но действительно ужасно.