2011-01-17 3 views
1

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

«Дас Empresas portuguesas Neste país»

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

Заранее благодарен!

EDIT: кажется, что копия/вставка текста здесь просто удалена. Может ли это быть связано с кодированием?

+1

ли они избежали символов? код ASCII или номер юникода может помочь –

+2

Это пробел. Ищите самый большой ключ на клавиатуре. –

+2

Если это скрытый персонаж, как его можно разместить на веб-странице? – skaffman

ответ

3

На португальском языке сам язык называется «português», где «ê» можно выразить в Юникоде как кодовую точку U + EA, которая является LATIN SMALL LETTER E CIRCUMFLEX, или как обычный ' e ', за которым следует кодовая точка U + 301, КОМБИНИРОВАННАЯ ЦИРКУМФЛЕКСНАЯ АКЦЕНТ. Таким образом, строка может быть 9, но может содержать 10 символов. Более длинная форма находится в форме нормализации D (образованной каноническим разложением), а более короткая - в NFC (образованная каноническим разложением , а затем по каноническому составу).

Однако, когда слово искажено, диакритика теряется, поэтому слова, подобные «portuguesas», которые согласуются по числу и полу с существительным «empresas», вообще не должны иметь диакритики.

Строка, которую вы отправили, содержит в ней только один символ, отличный от ASCII, и это печатный. Это слово «па».

Это показывает каждую логический код точку 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, или это может быть правильным «я ', За которым следует кодовая точка 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
$ 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 

В вашем посте я не вижу скрытых символов.

0

Если он приходит от RSS скачанного отсюда: http://feeds.feedburner.com/PublicoEconomia?format=xml они используют три байт UTF-8 символов для пунктуации (в частности: U + 201D RIGHT DOUBLE КАВЫЧКА, UTF-8: 0xE2 0x80 0x9D, должна быть символ сразу после «portuguesas»). Вероятно, вы едите первый байт в своем коде.