4

通常の文字に加えて、いくつかの奇妙な文字を含むユニコード文字列があります。これらの文字の一部の「UTF-16 (hex)」エンコーディングを既に見つけており、次のような簡単な正規表現を使用してそれらを削除しました。

$text =~ s/(\s+\x{200C}+|\x{200C}+\s+)/ /g;

上記の行は、不要な「幅ゼロの非結合スペース」を削除するためのものです。しかし、残りを削除するにはいくつかの困難があります。ユニコード文字列を指定できるツールまたはコマンドがあり、同等の「UTF-16(16進数)」エンコーディングを返すかどうか疑問に思っていました。したがって、基本的には、文字列 (奇妙な文字を含む) をフィードし、文字の「UTF-16 (16 進数)」エンコーディングを取得して、それらを削除するための正規表現を記述できるようにしたいと考えています。私のテキストはほとんどペルシャ語とアラビア語で書かれており、英語ではありません。


上記の質問の答えを得ましたが、私が抱えている問題全体はまだ存在しています。実際、「アラビア語母音」のような文字列から削除したい文字がいくつかあります。そして、これらの文字のコードを perl で見つけたので、それらを削除する行を書きました:

$text =~ s/\x{0618}\x{0619}\x{0621}\x{064B}\x{064C}\x{064D}\x{064E}\x{064F}\x{0650}\x{0651}\x{0652}\x{0653}\x{0654}\x{0655}\x{0656}\x{0657}\x{0658}\x{0659}\x{065A}\x{065B}\x{065C}\x{065D}\x{065E}\x{FC5E}\x{FC5F}\x{FC60}\x{FC60}\x{FC61}\x{FC62}\x{FE80}//g;

しかし、奇妙なことに、すべてのケースでうまくいくわけではありません。たとえば、「Arabic Kasra (\x{0650})」が検出され、このコード行に置き換えられるはずですが、そうではありません。以下の行の文字については、機能することを述べました。

\x{064B}\x{064C}\x{064D}\x{064E}\x{064F}\x{065A}\x{065B}\x{065C}\x{065D}\x{065E}\x{FC5E}\x{FC5F}\x{FC60}\x{FC60}\x{FC61}\x{FC62}\x{FE80}

他の人にとってはそうではありません:

\x{0618}\x{0619}\x{0621}\x{0650}\x{0651}\x{0652}\x{0653}\x{0654}\x{0655}\x{0656}\x{0657}\x{0658}\x{0659}

何か案は?

ありがとう、

4

1 に答える 1