No Break Space Char: 0xA0 / 0xC2A0 / 0xFFFD / 0xEFBFBD

风行水上 @ 2014-11-26 22:29:24
标签:

    缘由

    HTML代码中,一般的空格字符0x20除了用来排版HTML代码之外没有什么实质意义(以pre标签为代表的CSS属性white-space是一种特例)。

    因此,对于大多数HTML标签来说,连续的空格会被collapse为一个空格字符。一段文字开头的空格字符也不会帮你起到缩进或者对齐这样的作用。

    可我们有时就是想要一个“真正”的空格字符,这时就是所谓的No Break Space Char登场的时候了。

    • Unicode编码为 0xA0
    • 对应的UTF-8编码为 C2 A0
    • HTML中可以写作  或者 

    这个简单的“空格”却有时会带来另人难受的麻烦。

    有时,比如从Word粘贴文本到网页中的时候,会出现不希望看到的“乱码字符”。有时,有些涉及字符编码的函数调用会产生一些奇怪的字符输出。

    常见的情况是这样的:

    • 文本中不知什么时候混进了字符0xa0 (从Word粘贴文本到输入框可能会发生这种情况)
    • 文本本身是UTF-8编码,而0xa0不是有效的UTF-8编码
      • 此时或者直接输出为0xa0而无法在浏览器中正常显示,而是为黑色方块字符
      • 或者经由某些函数替换为Unicode编码中“无效字符”:U+FFFD,对应的UTF-8编码为 0xEF BF BD

    修正

    在HTML代码中的修正可以用如下PHP代码。先替换c2a0以免对误伤编码正确的字节A0

    $text = strtr($text, array("\xc2\xa0"=>' ',"\xa0"=>' '));
    

    查看

    怀疑文本中有这类字符的时候,可以:

    • 在Vim中用 ga或者:%! xxd进行查看。
    标签:

      分享到:
      comments powered by Disqus

      34/18ms