如何在HTML中显示多个空格,没有pre,nbsp或white-space:pre?

时间:2012-12-04 20:58:10

标签: html css text tinymce whitespace

我确信这不应该是可能的。不知何故,我的HTML标记中的段落中的多个空格不会折叠。它们在&nbsp;代码中 <pre>设置为white-space: pre-wrap;或{ {1}}并且通过在元素上强制white-space: pre;来改变行为

我的理解是,这些是保留空白的唯一三种方式,并且可以使两个或多个空格以HTML格式显示。

所以问题是:还有什么可能导致顺序空格显示为多个空格?必须有别的东西 - 但是在我知道它是什么之前我不能找到它,而我发现的每个来源都只是谈论style="white-space: normal;"&nbsp;<pre>或{{1 }}

密钥编辑:使用Firebug我尝试删除一些有问题的空白并再次输入。从键盘删除并重新输入时,空格表现正常 - 浏览器中没有意外的空格。所以必须是一个在视图源,文本编辑器等中显示为普通空格的角色,但实际上表现得像white-space: pre-wrap;。什么可以,而且至关重要的是,如何识别它以将其删除?违规输入的原始来源是Wysiwyg编辑器TinyMCE所以我正在添加该标签......


更多细节:我有一些HTML包含段落文本,其中包含多个空格,如下所示(在...之间直接从Firefox视图源复制):

white-space: pre;

如您所见,这些是常规空格,而不是 &nbsp;。该文档在其他地方有<p> blah blah.... nothing more than a ... blah blah </p> ,它们在视图源中显示,因此它们不是&nbsp;以某种方式伪装成源中的普通空格。

此外, CSS 设置为 &nbsp;或类似的内容:

  • Firebug的“Computed”面板没有列出与空白相关的规则。
  • 在段落上强制&nbsp;对空格没有任何影响。该规则确实出现在Firebug'Computed'面板中,因此它正在应用。
  • white-space: pre;应用于该段会导致其他更改,但不会更改这些多个顺序空格。例如,它会在所选文本的段落中的每个换行符的末尾显示一个额外的空格。因此,绝对不能以某种方式悄悄地设置为white-space: normal;

文档中没有 white-space: pre-wrap; 标记。在源代码中找到white-space: pre-wrap;找不到任何内容。

因此,它应该在浏览器中显示每个单词之间有一个空格。它没有。它会显示多个空格,就好像它是<pre><pre<pre>一样。但这不是其中任何一个。

必须以其他方式获得我不知道的&nbsp;效果。有什么其他方法来预先格式化空白并阻止多个空间崩溃吗?可能导致这种情况的原因。


一些背景说明:

  • 看哪些浏览器? Firefox 16.0.2,Google Chrome 23.0.1271.95 m(Windows)
  • 如果您不希望它显示,为什么标记中会有双倍间距的空格?我正在为CMS的前端/设计工作,其中用户将从Word输入文本和PDF通过TinyMCE所见即所得(不可协商)。因此,标记将是混乱的。修复CMS文本格式化程序以清理空格并清除标记超出了本工作的范围。
  • Doctype? white-space: pre;
  • 您确定有多个空格?当然,您可以选择一个,两个,在某些情况下,浏览器前端中的单词之间有三个空格。
  • 我可以看到所有代码吗?很抱歉,但这是一个发布前的网站,它不公开。随意询问具体的CSS规则,HTML标签,加载的javascript内容等等。

1 个答案:

答案 0 :(得分:6)

我猜测源代码中的违规空格字符不是SPACE (U+0020),而是NO-BREAK SPACE (U+00A0)。在视觉上,它们看起来完全相同,但如果您在十六进制编辑器中查看源代码(它显示文件中的各个字节),您将看到这些字符的不同编码。

修改1

此PHP代码应使用常规空格查找并替换有问题的字符:

$strNoBreakSpace = mb_convert_encoding('&#x00A0;', 'UTF-8', 'HTML-ENTITIES');
$strNormalSpace  = mb_convert_encoding('&#x0020;', 'UTF-8', 'HTML-ENTITIES');

$strInput = str_replace( $strNoBreakSpace, $strNormalSpace, $strInput );

修改2

创建两个空格字符的简单方法:

$strNoBreakSpace = json_decode('"\u00A0"');
$strNormalSpace  = json_decode('"\u0020"');