5

以下の範囲に該当する場合、文字列内のすべての 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最初のプロトタイプとして、関数で正規表現を使用して、最初の範囲内の文字を削除しようとしました。

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;

予想外のものが見えます。私の出力は次のように表示されます。

he�llo worl᷿fd は次のように置き換えられます

ここで注意すべき点が 2 つあります。

  1. \u1dfff1 つの文字として表示されません - 文字\u1dffに変換さfれ、最後にそれ自体の文字として扱われます
  2. 結果は空の文字列です。

これをどのように達成できるかについての提案は大歓迎です。


編集

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

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

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


編集2

String.fromCharacterCode「無効な」ユニコード範囲を取得する手法をさらに調査したところ、16 ビットを超える数値を指定すると、その数値の最下位 16 ビットが参照されるだけであることが判明しました。それは私が見ていたパターンを説明しています。結局のところ、最初の範囲だけを気にする必要があります。

4

1 に答える 1

4

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

buffer.replace(/[\ud800-\udfff]/g, "");
于 2013-06-02T02:49:44.997 に答える