2013-06-02 11 views
5

文字列内のすべてのUnicode文字を削除しようとしています。初期プロトタイプとしてjavacriptでさまざまな範囲のUnicode文字を削除します

\uD800-\uDFFF 
\u1D800-\u1DFFF 
\u2D800-\u2DFFF 
\u3D800-\u3DFFF 
\u4D800-\u4DFFF 
\u5D800-\u5DFFF 
\u6D800-\u6DFFF 
\u7D800-\u7DFFF 
\u8D800-\u8DFFF 
\u9D800-\u9DFFF 
\uAD800-\uADFFF 
\uBD800-\uBDFFF 
\uCD800-\uCDFFF 
\uDD800-\uDDFFF 
\uED800-\uEDFFF 
\uFD800-\uFDFFF 
\u10D800-\u10DFFF 

、私はちょうどreplace関数で正規表現を使用して第1の範囲内で文字を削除しようとしました。

var buffer = "he\udfffllo world"; 
var output = buffer.replace(/[\ud800-\udfff]/g, ""); 
d.innerText = buffer + " is replaced with " + output; 

この場合、文字は正常に置き換えられたようです。しかし

、私は

var buffer = "he\udfffllo worl\u1dfffd"; 
var output = buffer.replace(/[\ud800-\udfff\u1d800-\u1dfff]/g, ""); 
d.innerText = buffer + " is replaced with " + output; 

と私は予想外の何かを見ることを交換してください。 \u1dffが取得する -

  1. \u1dfffは1つの文字として表示されない:ハローworl᷿fdが

    に置き換えられ

    ここで注意すべき二つのものがありますよう私の出力が現れます文字に変換された末尾のfは、それ自体の文字として扱われます。

  2. 結果は空の文字列です。

これをどのように達成できるかについてのご意見は、大変ありがたくあります。


EDIT

私の全体的な目標は、encodeURIComponent機能が無効とみなし、すべての文字をフィルタリングすることです。私はいくつかのテストを実行し、上記のリストが無効な文字のセットであることを発見しました。たとえば、最初に1dfffをUnicode文字に変換してからencodeURIComponentに渡すコードでは、後者の関数によって例外が発生します。

var v = String.fromCharCode(122879); 
var uriComponent = encodeURIComponent(v); 

@Blender iはUnicode文字を表現するために私のコードでx代わりのuを使用していたことを指摘した後、私は質問の部分を編集しました。


EDIT 2

私は「無効」ユニコードは、さらに範囲をフェッチするための私の技術を調査し、そしてそれは結局のところ、あなたがより大きな16ビットの番号をString.fromCharacterCode与えれば、それはよ数字の下位16ビットを見てください。それは私が見ていたパターンを説明しています。それが判明したので、私は最初の範囲について心配する必要があります。

+0

'\ xdfff'が\のxdf'、' F'と '' F'として解釈されます。 – Blender

+0

あなたは正しいです、なぜ私は2回目の試みで奇妙な結果を見ていたのかを説明します。今質問のその部分を変更する。 –

+0

'\ u1D800'という表記法と他の表記法の大部分はまったく有効ではありません(技術的には、\ u1D800はU + 1D80の後に0を意味します。 –

答えて

4

文字列からUnicodeサロゲートコード単位を削除しようとしているようです。ただし、U + D800からU + DFFFまでが代理コードポイントです。名前を付けた残りの値は有効ではなく、有効なUnicode文字に割り当てられます。その場合には、以下が(Unicode文字を参照するために\uなく\xを使用する)で十分であろう。

buffer.replace(/[\ud800-\udfff]/g, ""); 
+0

Peter私はtを編集しました彼は、削除する必要がある文字のリストをどうやって思いついたかについて、さらに詳しく説明しています。 \ xを\ uに置き換えた後、構文エラーが表示されなくなりましたが、私が編集で概説した他の興味深い動作に気付きました。探してくれてありがとう。 –

+0

これをさらに掘り下げてみると、最初の範囲について心配する必要があることは間違いありません。私はその質問に2回目の編集で説明を追加しました。 –

関連する問題