以下の範囲に該当する場合、文字列内のすべての 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 つあります。
\u1dfff
1 つの文字として表示されません - 文字\u1dff
に変換さf
れ、最後にそれ自体の文字として扱われます- 結果は空の文字列です。
これをどのように達成できるかについての提案は大歓迎です。
編集
encodeURIComponent
私の全体的な目標は、関数が無効と見なすすべての文字を除外することです。いくつかのテストを実行したところ、上記のリストが無効な文字セットであることがわかりました。たとえば、次のコードでは、最初1dfff
に Unicode 文字に変換してから に渡しencodeURIComponent
、後者の関数によって例外が発生します。
var v = String.fromCharCode(122879);
var uriComponent = encodeURIComponent(v);
@Blender がUnicode 文字を表すためにコードx
の代わりに使用していることを指摘した後、質問の一部を編集しました。u
編集2
String.fromCharacterCode
「無効な」ユニコード範囲を取得する手法をさらに調査したところ、16 ビットを超える数値を指定すると、その数値の最下位 16 ビットが参照されるだけであることが判明しました。それは私が見ていたパターンを説明しています。結局のところ、最初の範囲だけを気にする必要があります。