鉴于字符串:“......年轻女孩---八个?九个?十个?---来跳舞......”,我想在我的浏览器中返回实际的破折号,例如长短划线。 / p>
但是当我在Erlang源代码中输入此代码以生成html中的字符串时:
Clip1 = re:replace(Clip,“---”,“\ - ”,[global,{return,binary}]),
我在浏览器中看到了这个:
“小女孩 - 八岁?九岁?十岁? - 来跳舞”如果我为em dash输入“\&#8212”也是一样。
换句话说,返回字符代码而不是我希望看到的字符。
如果我不逃避&在字符代码中我得到了这个:
小女孩--- mdash;八?九?十? --- MDASH;我在这里做错了什么?
非常感谢,
LRP
答案 0 :(得分:1)
这里有很多问题:
当您编写字符串文字时,\
字符是引号字符,它与字符串文字中的后续字符一起使用。由于引用&
没有特殊含义,因此&
按原样返回。因此字符串"\—"
变为"—"
。替换字符串中的&
将替换为模式匹配的字符。因此,要在字符串中输入&
,您需要编写"\\—"
。
你不能拥有一个角色&gt;字符串中有255个。如果你想要一个更大的字符,那么它需要是UTF-8编码的。像<<8212/utf8>>
这样的操作会创建一个带有UTF-8编码的em破折号的二进制文件。这是re
模块的限制,而不是将字符串作为列表,通常使用字符串作为列表允许您直接使用Unicode代码点进行编码。
修改强>
如果您使用选项re
,您会看到列表字符串中包含unicode
的未编码的unicode字符。所以:
21> re:replace(C, "---", [8212], [global,unicode,{return,list}]).
[46,46,46,121,111,117,110,103,32,103,105,114,108,32,8212,32,
101,105,103,104,116,63,32,110,105,110,101,63,32|...]
要将结果作为UTF-8编码二进制文件获取,您可以执行以下操作:
22> re:replace(C, "---", <<8212/utf8>>, [global,unicode,{return,binary}]).
<<46,46,46,121,111,117,110,103,32,103,105,114,108,32,226,
128,148,32,101,105,103,104,116,63,32,110,105,110,101,...>>
答案 1 :(得分:1)
你不需要正则表达式。
binary:replace(Clip, <<"---">>, <<8212/utf8>>, [global]).
http://erldocs.com/R16B03/stdlib/binary.html?i=26&search=binary:#replace/3
答案 2 :(得分:0)
<meta charset=\"utf-8\">
...到我返回浏览器的html的head部分。完成后,em dash和en dash显示得很好。
许多人感谢慷慨的人们花时间帮我解决问题。 rvirding在我的unicode表达中指出了一个错误,它解决了一个问题; fenolp引导我进入一个很好的二进制替换功能,我现在可以添加到我的技巧包中。
更深层次的问题是:我一直试图重新设计一个Erlang Cowboy REST(rest_pastebin)示例而没有完全理解我正在做的事情。然而,当我将我重新使用的代码与另一个REST示例(rest_hello_world)进行比较时,我发现了问题。所以另外非常感谢那些编写牛仔示例的人。我无法强调精心设计的示例代码对于我们这些想要掌握Erlang的人来说是多么重要。