实体编码 - 没有完美的解决方案?
Encoding of entities - no perfect solution?
我们使用 redmine (https://github.com/a-ono/redmine_ckeditor) 的 ckeditor 插件,遇到以下问题:
- 如果 basicEntities/entities 的编码设置为 false,xml/html 文本在通过 CKEditor (https://github.com/a-ono/redmine_ckeditor/issues/158) 存储时无法正确显示,按下显示源代码按钮时也会出现问题或重复编辑内容
- 如果未设置这些参数,代码块中的引号(显示为 ")、带参数的链接(& 编码不正确)和带变音符号或其他重音字母的 wiki 链接会出现问题(https://github.com/a-ono/redmine_ckeditor/issues/132 )
正如插件开发者 a-ono 所说:"There seems to be no perfect solution."
我找到了 http://komlenic.com/246/encoding-entities-to-work-with-ckeditor-3/ , http://ckeditor.com/forums/Support/inside-tries-create-paragraph#comment-54348 和一些关于 "forceSimpleAmpersand:true" 以及 config.entities_latin = false; 的附加信息,但我不太确定如何继续。我们正在将更多用户转移到 Redmine,但如果他们无法 post 链接或 xml/html 内容(例如作为错误报告的一部分)
所以这适用于所有 CKEditor 专业人士。有什么提示吗?
抱歉这么说,但看起来 Redmine 的插件坏了。 CKEditor 本身在这里没有任何作用 - 它可以正确地读写实体 如果 数据被正确加载。如果某些实体在将它们保存到数据库并加载回来后解码或编码过多,则意味着后端已损坏。不要触及 CKEditor 的选项,默认情况下完全没问题,后端应该是固定的(意味着 Redmine 的插件,或者不太可能,Redmine 本身)。
让我们考虑以下情况。您想在评论中写下关于 <xml>
标签的内容。它的 HTML 将是:
<p>This is a tag: <code><xml></code>.</p>
这也是 editor.getData()
将返回的内容,或者如果使用 <textarea>
自动集成时发布到服务器的内容。
现在,如果您这样做(例如在 demo 中):
editor.setData( '<p>This is a tag: <code><xml></code>.</p>' );
一切都会好起来的。将显示相同的内容:
然而,许多开发人员使用 CKEditor 与 <textarea>
s 的集成,不幸的是,他们并不完全理解它是如何工作的。让我们将存储在数据库中的确切数据加载到文本区域中:
<textarea><p>This is a tag: <code><xml></code>.</p></textarea>
如果您现在尝试使用 textarea.value
从 JavaScript 读取此文本区域的值,您将得到:
<p>This is a tag: <code><xml></code>.</p>
如您所见,<xml>
标签的编码丢失了,因为在 HTML 中 <
被读取为 <
。
所以您需要做的是在将数据加载到文本区域之前再次对数据进行编码:
<textarea><p>This is a tag: <code>&lt;xml&gt;</code>.</p></textarea>
现在看到所有 <
个字符变成了 <
,但是已经编码的 <
变成了 &lt;
。这将确保在将数据打印到 HTML 时正确保留所有实体。如您所见,它与 CKEditor 无关。这同样适用于显示在 CKEditor 中创建的数据——必须保留编码。如果有东西丢失了,这意味着后端编码或解码了数据,它不应该。
我们有一个用户坚持在他的 python 维基代码块中放入 python 解释器“>>>”。
这些被转换为 HTML 个实体 >>>保存到 wiki 数据库时。查看时,这些不会转换回“>>>”,因为它位于
块内。
我发现更改 plugins/redmine_ckeditor/lib/redmine_ckeditor/wiki_formatting/formatter.rb 第 17 行:
%Q[<pre>\n<code class="#{lang} syntaxhl">#{
Redmine::SyntaxHighlighting.highlight_by_language(code, lang)
}</code>\n</pre>]
至
%Q[<pre>\n<code class="#{lang} syntaxhl">#{
Redmine::SyntaxHighlighting.highlight_by_language(CGI.unescapeHTML(code), lang)
}</code>\n</pre>]
解决了代码中 HTML 个实体的问题。
我们使用 redmine (https://github.com/a-ono/redmine_ckeditor) 的 ckeditor 插件,遇到以下问题:
- 如果 basicEntities/entities 的编码设置为 false,xml/html 文本在通过 CKEditor (https://github.com/a-ono/redmine_ckeditor/issues/158) 存储时无法正确显示,按下显示源代码按钮时也会出现问题或重复编辑内容
- 如果未设置这些参数,代码块中的引号(显示为 ")、带参数的链接(& 编码不正确)和带变音符号或其他重音字母的 wiki 链接会出现问题(https://github.com/a-ono/redmine_ckeditor/issues/132 )
正如插件开发者 a-ono 所说:"There seems to be no perfect solution."
我找到了 http://komlenic.com/246/encoding-entities-to-work-with-ckeditor-3/ , http://ckeditor.com/forums/Support/inside-tries-create-paragraph#comment-54348 和一些关于 "forceSimpleAmpersand:true" 以及 config.entities_latin = false; 的附加信息,但我不太确定如何继续。我们正在将更多用户转移到 Redmine,但如果他们无法 post 链接或 xml/html 内容(例如作为错误报告的一部分)
所以这适用于所有 CKEditor 专业人士。有什么提示吗?
抱歉这么说,但看起来 Redmine 的插件坏了。 CKEditor 本身在这里没有任何作用 - 它可以正确地读写实体 如果 数据被正确加载。如果某些实体在将它们保存到数据库并加载回来后解码或编码过多,则意味着后端已损坏。不要触及 CKEditor 的选项,默认情况下完全没问题,后端应该是固定的(意味着 Redmine 的插件,或者不太可能,Redmine 本身)。
让我们考虑以下情况。您想在评论中写下关于 <xml>
标签的内容。它的 HTML 将是:
<p>This is a tag: <code><xml></code>.</p>
这也是 editor.getData()
将返回的内容,或者如果使用 <textarea>
自动集成时发布到服务器的内容。
现在,如果您这样做(例如在 demo 中):
editor.setData( '<p>This is a tag: <code><xml></code>.</p>' );
一切都会好起来的。将显示相同的内容:
然而,许多开发人员使用 CKEditor 与 <textarea>
s 的集成,不幸的是,他们并不完全理解它是如何工作的。让我们将存储在数据库中的确切数据加载到文本区域中:
<textarea><p>This is a tag: <code><xml></code>.</p></textarea>
如果您现在尝试使用 textarea.value
从 JavaScript 读取此文本区域的值,您将得到:
<p>This is a tag: <code><xml></code>.</p>
如您所见,<xml>
标签的编码丢失了,因为在 HTML 中 <
被读取为 <
。
所以您需要做的是在将数据加载到文本区域之前再次对数据进行编码:
<textarea><p>This is a tag: <code>&lt;xml&gt;</code>.</p></textarea>
现在看到所有 <
个字符变成了 <
,但是已经编码的 <
变成了 &lt;
。这将确保在将数据打印到 HTML 时正确保留所有实体。如您所见,它与 CKEditor 无关。这同样适用于显示在 CKEditor 中创建的数据——必须保留编码。如果有东西丢失了,这意味着后端编码或解码了数据,它不应该。
我们有一个用户坚持在他的 python 维基代码块中放入 python 解释器“>>>”。 这些被转换为 HTML 个实体 >>>保存到 wiki 数据库时。查看时,这些不会转换回“>>>”,因为它位于
块内。我发现更改 plugins/redmine_ckeditor/lib/redmine_ckeditor/wiki_formatting/formatter.rb 第 17 行:
%Q[<pre>\n<code class="#{lang} syntaxhl">#{ Redmine::SyntaxHighlighting.highlight_by_language(code, lang) }</code>\n</pre>]
至
%Q[<pre>\n<code class="#{lang} syntaxhl">#{ Redmine::SyntaxHighlighting.highlight_by_language(CGI.unescapeHTML(code), lang) }</code>\n</pre>]
解决了代码中 HTML 个实体的问题。