【问题标题】:What is the hidden character in this string?这个字符串中隐藏的字符是什么?
【发布时间】:2011-01-17 14:34:45
【问题描述】:

我正在解析来自新闻提要的字符串,我的应用程序出现了一些奇怪的行为。我一直在寻找更接近此提要的内容,并在其中发现了一些隐藏的字符。这是取自该提要的示例:

"das empresas portuguesas neste país"

“portuguesas”这个词之后似乎有一些字符。我怎样才能找到它是什么 char 以便我可以设法删除它们?

提前致谢!

编辑:似乎这里的复制/粘贴文本刚刚删除了它。这可能与编码有关吗?

【问题讨论】:

标签: string unicode character-encoding


【解决方案1】:

在葡萄牙语中,语言本身的名称是“português”,其中“ê”可以在 Unicode 中表示为代码点 U+EA,即带有 CIRCUMFLEX 的拉丁小写字母 E,或常规的“e” ' 后跟代码点 U+301,COMBINING CIRCUMFLEX ACCENT。所以字符串可能是 9,但它可能是 10 个字符长。较长的形式是规范化形式 D(由规范分解形成),较短的形式是 NFC(由规范分解随后由规范组合形成)。

但是,当单词发生屈折变化时,变音符号就丢失了,所以像“portuguesas”这样与名词“empresas”在数和性别上一致的词根本不应该带有任何变音符号。

您发送的字符串中只有一个非 ASCII 字符,并且是打印字符。它在“país”这个词中。

这显示了 UTF-8 输入的每个逻辑代码点:

$ echo "das empresas portuguesas neste país" | perl -CS -ne 'printf "%v02X\n", $_'
64.61.73.20.65.6D.70.72.65.73.61.73.20.70.6F.72.74.75.67.75.65.73.61.73.20.6E.65.73.74.65.20.70.61.ED.73.0A

这显示了它的每个单独的字节:

$ echo "das empresas portuguesas neste país" | perl -C0 -ne 'printf "%v02X\n", $_'
64.61.73.20.65.6D.70.72.65.73.61.73.20.70.6F.72.74.75.67.75.65.73.61.73.20.6E.65.73.74.65.20.70.61.C3.AD.73.0A

如果您只想查看非 ASCII 码点,请执行以下操作:

# logical code points
$ echo "das empresas portuguesas neste país" | perl -CS -pe 's/[^\x00-\x7F]/sprintf "\x5Cx{%X}", ord $&/ge'
das empresas portuguesas neste pa\x{ED}s

# separate bytes
$ echo "das empresas portuguesas neste país" | perl -C0 -pe 's/[^\x00-\x7F]/sprintf "\x5Cx%X", ord $&/ge'
das empresas portuguesas neste pa\xC3\xADs

“í”可以是代码点 U+ED,也可以是常规的“i”,后跟代码点 U+301,组合重音。如果是这样,它会显示如下:

# show the NFD form
$ perl -CS -le 'print "das empresas portuguesas neste pai\x{301}s"'                                                     
das empresas portuguesas neste país

# show UTF-8 non-ASCII code points
$ perl -CS -le 'print "das empresas portuguesas neste pai\x{301}s"' | perl -CS -pe 's/[^\x00-\x7F]/sprintf "\x5Cx{%X}", ord $&/ge'
das empresas portuguesas neste pai\x{301}s

# show non-ASCII bytes
$ perl -CS -le 'print "das empresas portuguesas neste pai\x{301}s"' | perl -C0 -pe 's/[^\x00-\x7F]/sprintf "\x5Cx%X", ord $&/ge'
das empresas portuguesas neste pai\xCC\x81s

可能是 Stack Overflow(或其他东西)重写了您的字符串,可能会删除非打印字符。所以你可能有一些我们看不到的东西,因为它不在我们查看的数据中。

【讨论】:

    【解决方案2】:
    $ echo "das empresas portuguesas neste país" | od -b 
    0000000 144 141 163 040 145 155 160 162 145 163 141 163 040 160 157 162
    0000020 164 165 147 165 145 163 141 163 040 156 145 163 164 145 040 160
    0000040 141 303 255 163 012
    0000045
    

    我在您的帖子中看不到任何隐藏字符。

    【讨论】:

      【解决方案3】:

      如果它来自从这里下载的 RSS: http://feeds.feedburner.com/PublicoEconomia?format=xml 他们使用三字节的 UTF-8 字符作为标点符号(特别是:U+201D 右双引号,UTF-8:0xE2 0x80 0x9D,应该是“portuguesas”之后的字符)。您可能正在吃掉代码中的第一个字节。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-01
        • 2012-11-08
        • 2015-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多