多言語入力で印刷できないUnicode文字を削除するにはどうすればよいですか?JSの非印刷のUnicodeを切り捨てる
異なる地域のユーザーが文字列を貼り付けると、意図せず非印刷文字が埋め込まれることがあります。
encodeURI("شنط") = "%D8%B4%D9%86%D8%B7"
encodeURI("戦艦帝国") = "%E6%88%A6%E8%89%A6%E5%B8%9D%E5%9B%BD"
たとえば、次のよう
var weird = "%E2%80%AA%E2%80%8ETest%E2%80%AC"
var displaysAs = decodeURI(weird); // Users see only "Test"
しかし、私はこれらのような他の言語に影響を与えない方法で、非印刷文字を削除する方法を見つけ出すことはできません。たとえば、上記の奇妙な例を修復しようとする試みは動作しません:
var weird = "%E2%80%AA%E2%80%8ETest%E2%80%AC";
var displaysAs = decodeURI(weird);
var stillWeird = encodeURI(displaysAs.replace(/\s/g, ""));
// value is again "%E2%80%AA%E2%80%8ETest%E2%80%AC"
console.log('before:', weird);
console.log('after:', displaysAs);
console.log('again:', stillWeird);
.as-console-wrapper{min-height:100%}
コメントに記載されているとおり、これは主に仕様の問題です。私は、非印刷のUnicode式の列挙を持っていません。私はブラウザの入力にユニコード文字列を貼り付けることができ、その中に文字が表示されていないことに気付かないことしか観察できません。私は、いくつかロジックは、各ユニコード文字が何かを表示するかどうかをブラウザで判断すると仮定します。この問題は、「表示文字列」を取得するために、同じロジックを基になる文字列に適用できる場合には解決されます。
別の言い方をすれば:ブラウザ上が同じに見える任意の二つのUnicode文字列のは、私は彼らの値が同一であることを保証変換を必要とします。
「印刷不可」を定義します。正確な定義は質問に対する答えを効果的に構成します。残りは正規表現やアルゴリズムとして表現することに過ぎません。 Cf。 http://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters –
@ JukkaK.Korpela - 確かに。私は単なるUnicode文字列を入力に貼り付けることができ、印刷できない文字が入力文字列に含まれていることに気付かないことを単に観察することができます。私はブラウザの*いくつかの*ロジックが各ユニコード文字が何かを表示するかどうかを決定すると仮定します。私はユニコード文字列に同じロジックを適用して、 "表示文字列"を取得します。つまり、ブラウザ上で見た目が同じである2つの文字列について、それらの値が同じであることを保証する変換が必要です。実際には、私は質問にこれを追加する必要がありますね... – feetwet
['Spoofchecker'](https://secure.php.net/manual/ja/class.spoofchecker.php)のようなものを探しているようですね。しかし、私はこの機能のJavaScriptライブラリを見つけることができませんでした。 –