現在のドキュメントを文字コード自動判定で読み直す
by
unarist
2017-05-28 [2017/05/28 09:24:34]
charsetの指定がアレなサイトをMobileSafariで見たい時に
@@ -1,8 +1,7 @@
/*
- * @title 現在のドキュメントをSJISで読み直す
+ * @title 現在のドキュメントを文字コード自動判定で読み直す
* @include http://*
* @license MIT License
- * @require
*/
const xhr = new XMLHttpRequest();
@@ -11,10 +10,34 @@
xhr.onload = function() {
const reader = new FileReader();
reader.onload = function() {
- document.write(b.result);
+
+ // 簡易文字コード検出(このbookmarkletの用途的にUTF-8は考慮してない)
+ const enc = (function(bytes) {
+ let cnt = 0;
+ for (let i = 0; i < bytes.length - 1 && cnt < 50; ++i) {
+ const b = bytes[i];
+
+ if (b == 0x1B) return "iso-2022-jp";
+ if (b < 0x81) continue;
+
+ ++cnt;
+ if (b < 0xA0) {
+ if ((b == 0x8E || b == 0x8F) && bytes[i + 1] >= 0xA1) {
+ ++i;
+ } else {
+ return "shift-jis";
+ }
+ } else if (b >= 0xE0) {
+ ++i;
+ }
+ }
+ return "euc-jp";
+ })(new Uint8Array(reader.result));
+
+ // TextDecoder使いたいですね... http://caniuse.com/#feat=textencoder
+ reader.onload = function() { alert(reader.result);document.write(reader.result); };
+ reader.readAsText(xhr.response, enc);
};
- reader.readAsText(a.response, prompt("enc?", "Shift_JIS"))
+ reader.readAsArrayBuffer(xhr.response);
};
-xhr.send();
-
-// javascript:(function(a,b){a.open("GET",location.href);a.responseType="blob";a.onload=function(){b.onload=function(){document.write(b.result)};b.readAsText(a.response,prompt("enc?","Shift_JIS"))};a.send()})(new XMLHttpRequest,new FileReader)
+xhr.send();
/*
* @title 現在のドキュメントを文字コード自動判定で読み直す
* @include http://*
* @license MIT License
*/
const xhr = new XMLHttpRequest();
xhr.open("GET", location.href);
xhr.responseType = "blob";
xhr.onload = function() {
const reader = new FileReader();
reader.onload = function() {
// 簡易文字コード検出(このbookmarkletの用途的にUTF-8は考慮してない)
const enc = (function(bytes) {
let cnt = 0;
for (let i = 0; i < bytes.length - 1 && cnt < 50; ++i) {
const b = bytes[i];
if (b == 0x1B) return "iso-2022-jp";
if (b < 0x81) continue;
++cnt;
if (b < 0xA0) {
if ((b == 0x8E || b == 0x8F) && bytes[i + 1] >= 0xA1) {
++i;
} else {
return "shift-jis";
}
} else if (b >= 0xE0) {
++i;
}
}
return "euc-jp";
})(new Uint8Array(reader.result));
// TextDecoder使いたいですね... http://caniuse.com/#feat=textencoder
reader.onload = function() { alert(reader.result);document.write(reader.result); };
reader.readAsText(xhr.response, enc);
};
reader.readAsArrayBuffer(xhr.response);
};
xhr.send();
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。