2009-09-24 7 views
0

J'ai analysé une page HTML avec mochiweb_html et que vous souhaitez analyser le fragment de texte suivantParsing "– " avec Erlang re

Fondamentalement, je veux diviser la chaîne sur les espaces et dash caractère et extraire les chiffres dans les premiers caractères.

Maintenant, la chaîne ci-dessus est représentée comme la liste suivante Erlang

[48,32,226,128,147,32,49] 

Je suis en train de le diviser en utilisant l'expression rationnelle suivante:

{ok, P}=re:compile("\\xD2\\x80\\x93"), %% characters 226, 128, 147 

re:split([48,32,226,128,147,32,49], P, [{return, list}]) 

Mais cela ne fonctionne pas; il semble que le caractère \ XD2 est le problème [si je le supprimer de la regex, la scission se produit]

Quelqu'un pourrait-il expliquer peut-

  • ce que je fais mal ici?
  • pourquoi le caractère '–' exige apparemment trois entiers pour la représentation [226, 128, 147]

Merci.

Répondre

2

226,128,147 est E2,80,93 dans hex.

> {ok, P} = re:compile("\xE2\x80\x93"). 
... 
> re:split([48,32,226,128,147,32,49], P, [{return, list}]). 
["0 "," 1"] 
+0

Vous avez raison. Désolé de perdre du temps pour tout le monde. – Justin

0

Quant à votre deuxième question, de savoir pourquoi un tiret prend 3 octets pour encoder, c'est parce que le tableau de bord de votre entrée est pas un trait d'union ASCII (2D hexadécimal), mais est un Unicode en-dash (hex 2013). Votre code reçoit ceci dans UTF-8 encoding, plutôt que le plus évident UCS-2 encoding. Hex 2013 sort à l'hex E28093 en encodage UTF-8. Si votre prochaine question est "pourquoi UTF-8", c'est parce qu'il est beaucoup plus facile de remplacer un ancien système utilisant des caractères 8 bits et des chaînes de style C terminées par zéro pour utiliser Unicode via UTF-8 que de tout élargir. UCS-2 ou UCS-4. UTF-8 reste compatible avec les chaînes ASCII et C, donc la conversion peut être faite au fur et à mesure au cours des années, voire des décennies si besoin est. Les caractères larges nécessitent un effort de conversion ponctuel "Big Bang", où tout doit être déplacé vers le nouveau système à la fois. UTF-8 est donc beaucoup plus populaire sur les systèmes avec des legs datant d'avant le début des années 90, lors de la création d'Unicode.

+0

Si Erlang utilise des caractères larges ou non dépend de vos préférences. Selon http://www.erlang.org/doc/man/unicode.html (ajouté en R13), "[i] n listes, les données Unicode sont codées comme des entiers, chaque entier représentant un caractère et codé simplement comme Unicode codepoint pour le caractère ". Bien sûr, rien ne vous empêche de mettre des données UTF-8 dans des listes, si cela est approprié pour votre programme. Les fichiers binaires ne peuvent contenir que des octets, généralement Latin-1 ou UTF-8. – legoscia

+0

Merci. Réponse éditée de manière appropriée. –