Что за скрытый символ в этой строке? - PullRequest
1 голос
/ 17 января 2011

Я анализирую строку из новостной ленты, и в моем приложении происходит странное поведение. Я искал ближе к этому каналу, и я нашел некоторые скрытые символы в нем. Вот пример, взятый из этого канала:

"das empresas portuguesas neste país"

После слова «portuguesas», похоже, появляется какой-то символ. Как я могу найти, что это за символ, чтобы я мог удалить их?

Заранее спасибо!

РЕДАКТИРОВАТЬ: кажется, что копирование / вставка текста здесь просто удалили его. Может ли это быть связано с кодировкой?

Ответы [ 3 ]

3 голосов
/ 17 января 2011

В португальском языке сам язык называется «português», где это «ê» может быть выражено в Юникоде либо как кодовая точка U + EA, то есть LATIN SMALL LETTER E WITH CIRCUMFLEX, либо как обычное 'e ', сопровождаемый кодовой точкой U + 301, СОЧЕТАНИЕ КОМБИНИРОВАНИЯ CIRCUMFLEX. Таким образом, строка может быть 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

Возможно, переполнение стека (или что-то еще) переписало вашу строку, возможно, удалив непечатаемые символы. Так что у вас могут быть вещи, которые мы не можем увидеть, потому что их нет в данных, на которые мы смотрели.

0 голосов
/ 17 января 2011

Если это происходит из rss, загруженного отсюда: http://feeds.feedburner.com/PublicoEconomia?format=xml они используют трехбайтовые символы UTF-8 для бентуации (в частности: U + 201D ПРАВИЛЬНАЯ ДВОЙНАЯ КВАРТАЖНАЯ МАРКА, UTF-8: 0xE2 0x80 0x9D,должен быть символом сразу после "portuguesas").Вы, вероятно, съели первый байт в вашем коде.

0 голосов
/ 17 января 2011
$ 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

Я не вижу скрытых символов в вашем сообщении.

...