如何将UTF-8解码为HTML标签

时间:2019-05-08 19:52:20

标签: html ruby encoding

我的数据库中保存了一个HTML文档,如下所示:

\\u003cp style=\\\"text-align: center; opacity: 1;\\\"\\u003e\\u003cstrong\\u003e\\u003cspan style=\\\"font-size: 18pt;\\\

我知道,这很丑陋,我知道,这不是理想的方式,但这是一个旧系统。

我的任务是获取所有这些HTML,并将它们转换为Google文档中的文档。实际上,Google文档可以很好地将HTML解析为其内部格式,但是HTML必须是有效的HTML,使用<p>而不是\\u003cp

我正在尝试将此字符串转换/解码/解析/转换为有效的HTML,但是到目前为止,没有任何运气。

我已经尝试过的事情

htmlentities gem,CGI解码,Nokogiri::HTML.parseJSON.parse,但它们都没有完成。

我也尝试过string.encode(xxxx),但也没有碰运气。我真的希望.encode方法可以做到,但我无法使其正常工作,也许我使用的编码错误? (我尝试使用所有ISO-xxx编码)

2 个答案:

答案 0 :(得分:1)

使用Array#pack

string = "\\u003cp style=\\\"text-align: center; opacity: 1;\\\"\\u003e\\u003cstrong\\u003e\\u003cspan style=\\\"font-size: 18pt;\\"

string.gsub(/\\u(....)/) { [$1.hex].pack("U") }
# => "<p style=\\\"text-align: center; opacity: 1;\\\"><strong><span style=\\\"font-size: 18pt;\\"

答案 1 :(得分:1)

以下是您的快速解决方法:

input_string.gsub(/\\u(\h{4})/) { [$1.to_i(16)].pack('U') }

使用上面提供的示例输入,结果为:

"<p style=\\\"text-align: center; opacity: 1;\\\"><strong><span style=\\\"font-size: 18pt;\\"

说明:

\u003c == <。左侧是转义的unicode字符;这和\\u003c不同,后者是一个文字反斜杠,后跟u003c

正则表达式\\u(\h{4})将匹配该表达式的任何出现(\h代表“十六进制”,等效于[0-9a-fA-F]),Array#pack将二进制序列转换为(在这种情况下)是UTF-8字符。


当然,理想情况下,您将从根本上解决问题,而不是重新设计这样的解决方法。但是,如果那超出了您的控制范围,则必须有一种解决方法。