Regex 查找unicode字符串的十六进制代码

Regex 查找unicode字符串的十六进制代码,regex,perl,bash,text,unicode,Regex,Perl,Bash,Text,Unicode,我有一个unicode字符串,除了普通字符外,还包含一些奇怪的字符。我已经找到了其中一些字符的“UTF-16(十六进制)”编码,并使用一些简单的正则表达式将其删除,例如: $text =~ s/(\s+\x{200C}+|\x{200C}+\s+)/ /g; 上述行用于删除不必要的“零宽度非接合空间”。 但我有一些困难,消除其余的。我想知道是否有一个工具或命令,你可以给它你的unicode字符串,它返回等效的“UTF-16(十六进制)”编码。 因此,基本上我想用我的字符串(其中包含奇怪的字符)

我有一个unicode字符串,除了普通字符外,还包含一些奇怪的字符。我已经找到了其中一些字符的“UTF-16(十六进制)”编码,并使用一些简单的正则表达式将其删除,例如:

$text =~ s/(\s+\x{200C}+|\x{200C}+\s+)/ /g;
上述行用于删除不必要的“零宽度非接合空间”。 但我有一些困难,消除其余的。我想知道是否有一个工具或命令,你可以给它你的unicode字符串,它返回等效的“UTF-16(十六进制)”编码。 因此,基本上我想用我的字符串(其中包含奇怪的字符)来填充它,并获得字符的“UTF-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}
有什么想法吗


谢谢,

U+200C的UTF-16le和UTF-16be编码是
“\x0C\x20”
“\x20\x0C”
,而不是
“\x{200C}”
。这与UTF-16无关

您只需要字符数的十六进制表示。(实际上,它甚至与Unicode没有任何关系。)

  • 每个字符的十六进制:

    print(sprintf("%v04X", $str), "\n");
    
  • 非ASCII和不可打印ASCII字符有时为十六进制,有时为八进制:

    use Data::Dumper qw( Dumper );
    local $Data::Dumper::Useqq = 1;
    local $Data::Dumper::Terse = 1;
    local $Data::Dumper::Indent = 0;
    print(Dumper($str), "\n");
    
    my $lit = qq{"\Q$str\E"};
    $lit =~ s/([^\x20-\x7E])/ sprintf('\\x{%04X}', ord($1)) /eg;
    print("$lit\n");
    
  • 非ASCII和不可打印ASCII字符的十六进制:

    use Data::Dumper qw( Dumper );
    local $Data::Dumper::Useqq = 1;
    local $Data::Dumper::Terse = 1;
    local $Data::Dumper::Indent = 0;
    print(Dumper($str), "\n");
    
    my $lit = qq{"\Q$str\E"};
    $lit =~ s/([^\x20-\x7E])/ sprintf('\\x{%04X}', ord($1)) /eg;
    print("$lit\n");
    

亲爱的ikegami,谢谢您的回复。它工作了,现在打印字符代码。但现在我面临另一个问题。我有一些像“ARABIC KASRA”这样的字符,它的代码是\x{0650},我的脚本中有一个用于该字符的正则表达式,可以将其从字符串中删除。但奇怪的是,它不工作,这个字符仍然存在于字符串中。我在我的第一篇文章中添加了几行更清楚地描述这个案例。你忘记了
s/\x{0618}\x{0619}\x{0621}…/…/
中的方括号。哦,很抱歉这个错误。