как декодировать UTF-8 в теги HTML - PullRequest
0 голосов
/ 08 мая 2019

У меня есть 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.parse, JSON.parse и никто из них не сделалработа.

Я тоже пытался string.encode(xxxx) но тоже без везения.Я действительно надеялся, что метод .encode сделает это, но я не смог заставить его работать, может быть, я использую неправильную кодировку?(Я пытался использовать все ISO-xxx кодировки)

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Вот быстрый обходной путь для вас:

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 == <.Левая сторона - это экранированный символ Юникода;это не то же самое, что \\u003c, который является буквальным обратным слешем, за которым следует u003c.

Регулярное выражение \\u(\h{4}) будет соответствовать любым вхождениям этого (\h обозначает "шестнадцатеричный" иэквивалентно [0-9a-fA-F]), а Array#pack преобразует двоичную последовательность в (в данном случае) символ UTF-8.


В идеале, конечно, вы быРешите проблему в корне, а не пытайтесь подобрать обходной путь, как это.Но если это не под вашим контролем, то обходного пути будет достаточно.

1 голос
/ 08 мая 2019

Использование 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;\\"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...