在葡萄牙语中,语言本身的名称是“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(或其他东西)重写了您的字符串,可能会删除非打印字符。所以你可能有一些我们看不到的东西,因为它不在我们查看的数据中。