用Erlang解析\“ - \”

时间:2009-09-24 14:23:15

标签: erlang

我用mochiweb_html解析了一个HTML页面,想要解析下面的文本片段

0 - 1

基本上我想在空格和短划线字符上拆分字符串并提取第一个字符中的数字。

现在上面的字符串表示为以下Erlang列表

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

我正在尝试使用以下正则表达式将其拆分:

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

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

但这不起作用;似乎\ xD2字符是问题[如果我从正则表达式中删除它,发生拆分]

有人可能会解释

  • 我在这里做错了什么?
  • 为什么' - '字符似乎需要三个整数来表示[226,128,147]

感谢。

2 个答案:

答案 0 :(得分:2)

226,128,147是十六进制中的E2,80,93。

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

答案 1 :(得分:0)

至于你的第二个问题,关于破折号需要3个字节进行编码的原因,这是因为输入中的破折号不是ASCII连字符(十六进制2D),而是Unicode en-dash(十六进制2013)。您的代码是在UTF-8 encoding中收到的,而不是更明显的UCS-2 encoding。 Hex 2013采用UTF-8编码的十六进制E28093。

如果您的下一个问题是“为什么选择UTF-8”,那是因为使用8位字符和以null结尾的C样式字符串来改造旧系统以通过UTF-8使用Unicode比将所有内容扩展到UCS要容易得多-2或UCS-4。 UTF-8仍然与ASCII和C字符串兼容,因此转换可以在几年内逐步完成,如果需要则可以数十年。宽字符需要“大爆炸”一次性转换,一切都必须立即移动到新系统。因此,UTF-8在具有遗产的系统上更受欢迎,这些系统的历史可追溯到90年代早期,当时创建了Unicode。