2017-01-03 20 views
1

残念ながら、私は正しい解決策を見いだせませんでした:Windows-1251(cp1251)でエンコードされたURLスライスをデコードする必要があります。 。 decodeURI()は、decodeURIComponent()が、(私は理解しているように)彼らはUTF-8のみのために働く -JavaScriptでURLエンコードされたwindows-1251(cp1251)文字列をデコードする

は、私が知っているtheese方法があります。私が見つけた解決策は、廃止されたメソッドescape()とunescape()を使用しています。

例えば、配列がある:

%EF%以下のF0%のEEの%E3%以下のF0の%E0%のEC%のEC%E8%以下のF0の%のEE%E2%E0%ED%E8%のE5

メソッドdecodeURI()およびdecodeURIComponent()は例外を発生させます。

助けに感謝します。

+0

彼らはUnicodeをサポートしていないため、これらの方法は推奨されません。私はそれがあなたの場合の問題だとは言いません。 –

+0

@ÁlvaroGonzálezこのような決定は decodeURIComponent(unescape( '%EF%F0%EE%E3%F0%E0%EC%EC%E8%F0%EE%E2%E0%ED%E8%E5')) しかし、結果はISO-8859-1のシーケンス – Romanzhivo

+0

あなた、ブラウザ、またはnodej(あるいは何か)はどのような環境ですか? – Bergi

答えて

2

私が見るところでは、ブラウザにレガシー文字セットを含むパーセントエンコーディングスキームの組み込みサポートは組み込まれていません。

  1. 、WIN-1251オクテットを表す%の-escapesを見つけるには、下記

が1である(JS String)に対応する文字に勝利-1251オクテットをデコード:あなたはにする必要がありますそれを行う方法。 #1の場合、3文字の大文字のエスケープだけがデコードする必要があると仮定し、文字列の残りの部分はすでにASCIIであると仮定しているため、これにはinputStr.replace(/%([0-9A-Z]{2})/g,)を使用します。

実際のデコードでは、win-1251オクテットからJS文字へのマッピングが必要です。以下の例では、楽しいためにTextDecoder.decode() APIを使ってマッピングを構築しています(JSの異なる文字セット間で変換しようとしているときにこの答えを見つけた場合)。 (注:この時点では普遍的にサポートされているわけではなく、Gecko/Blinkだけがサポートしています)。

私は最初にこの回答に使用したかったhttps://github.com/mathiasbynens/windows-1251もありますが、デコードマップを手動で作成する方が簡単であることが判明しました。

var decodeMap = {}; 
 
var win1251 = new TextDecoder("windows-1251"); 
 
for (var i = 0x00; i < 0xFF; i++) { 
 
    var hex = (i <= 0x0F ? "0" : "") +  // zero-padded 
 
      i.toString(16).toUpperCase(); 
 
    decodeMap[hex] = win1251.decode(Uint8Array.from([i])); 
 
} 
 
// console.log(decodeMap); 
 
// {"10":"\u0010", ... "40":"@","41":"A","42":"B", ... "C0":"А","C1":"Б", ... 
 

 

 
// Decodes a windows-1251 encoded string, additionally 
 
// encoded as an ASCII string where each non-ASCII character of the original 
 
// windows-1251 string is encoded as %XY where XY (uppercase!) is a 
 
// hexadecimal representation of that character's code in windows-1251. 
 
function percentEncodedWin1251ToDOMString(str) { 
 
    return str.replace(/%([0-9A-F]{2})/g, 
 
    (match, hex) => decodeMap[hex]); 
 
} 
 

 
console.log(percentEncodedWin1251ToDOMString("%EF%F0%EE%E3%F0%E0%EC%EC%!%E8%F0%EE%E2%E0%ED%E8%E5a"))

+0

Nickolay、ありがとうございました!この決定は機能しますが、私は他の決定を見つけたようです。私は知らないのですが、サイトhttp://www.codenet.ruからスクリプトを公開できますか? その決定にはマップが含まれており、TextDecoder.decode()APIのような実験的技術はありません。 – Romanzhivo

+0

@Romanzhivoできます見つけたソリューションへのリンクを投稿しますか? (私の例の '実験的な'部分は、ハードコードされたマップに簡単に置き換えることができます。) – Nickolay

+0

Nickolay、私はこのサイトhttp://codenet.ruのソリューションから、サイトのスクリプトで見つけたものをいくつか変更して、一時的にhttp://code.romanzhivo.com/テスト/デコード - ウィンドウ - 1251.js PS私はコメントのあなたの名前にリンクすることはできません:) – Romanzhivo

関連する問題