談談不換行空格

2021-06-17 15:12:42 字數 2865 閱讀 6618

昨天工作中遇到了乙個問題問題:php程式從資料庫中取出變數$a(值為"car ws"),經過iconv轉碼從utf8到gb2312後,賦值給$b,結果判斷語句$a == $b 竟然是false!

究其原因原來是這裡的空格是不換行空格。

不換行空格(non-blocking space)也是一種空格,它和普通空格的區別在於在排版的時候表現不同。比如在word中,下面一段話在「如果它」三個字中間有兩個空格,第一段是使用普通空格的排版表現,第二段是使用不換行空格(word中輸入不換行空格使用ctrl+shift+space)的排版表現。

第一段中「如」和「果」字中間的空格就被換行了,而第二段中的「如果它」三個字中的不換行空格就像是告訴word:這三個字是連在一起的,你如果要進行換行,就把我們一起進行換行,不能從中間隔斷~所以謂之「不換行空格」。

在html中也有不換行空格的概念, (本身就是non-blocking space的縮寫)。在html中使用 也能達到不換行的目的,比如下面這個例子:

文字中的「排版時」三個字中間有空格,第一段使用普通空格,第二段使用 (html字符集中的non-blocking),第三段使用utf-8字符集中的non-blocking space(我是直接從word中複製出來的,sublime text中如何輸入non-blocking space沒查出來,有知道的麻煩告訴一下)

在瀏覽器下顯示情況:

之所以這麼表現的原因和word中是一樣的。

在不同編碼下的不換行空格有不同的值設定,比如

在utf8中,值為0xc2,0xa0(所以使用urlencode編碼不換行空格會顯示%c2%a0)

在html中,值為 ,或者 (可以參考html特殊字元對照表

下圖是不換行空格在不同字符集的表示

從上張表中可以看出,最大的問題就是不換行空格並不是在所有編碼中都存在,比如在我們經常使用到的gbk,gb2312,gb18032中都是沒有不換行空格的。於是在字元轉碼中就會遇到問題了,主要歸結於從乙個有不換行空格的編碼轉換到沒有不換行空格的編碼的時候,程式會怎麼處理這個不換行空格?

在php中,看下面這個程式:

<?php 

$normalspace = " ";

$nonblockingspace = " ";

echo urlencode($normalspace), php_eol;

echo urlencode($nonblockingspace), php_eol;

$normalspace_gb2312 = iconv("utf-8", "gb2312", $normalspace);

$nonblockingspace_gb2312 = iconv("utf-8", "gb2312", $nonblockingspace);

echo urlencode($normalspace_gb2312), php_eol;

echo urlencode($nonblockingspace_gb2312), php_eol;

$normalspace_gb2312_2 = iconv("utf-8", "gb2312//translit", $normalspace);

$nonblockingspace_gb2312_2 = iconv("utf-8", "gb2312//translit", $nonblockingspace);

echo urlencode($normalspace_gb2312_2), php_eol;

echo urlencode($nonblockingspace_gb2312_2), php_eol;

(其中的nonblockingspace是不換行空格,在vim中是使用ctrl +k, shift +n, shift +s打出來的)

輸出:

在iconv的out_charset不加//ignore或者//translit的情況下出現的notice就是提示說這裡的$nonblockingspace在gb2312中是沒有的,強制轉換可能會出現問題。然後在iconv中就把它過濾掉(準確來說是從開頭到第乙個非法字元截斷了),因此$nonblockingspace_gb2312 是空字串。

而iconv加上了//translit之後,php程式會去gb2312字符集中尋找和不換行空格最相近的乙個字元(也就是空格),因此$nonblockingspace_gb2312_2是普通空格。

到這裡最初的問題就完全可以理解了

php程式從資料庫中取出變數$a(值為"car ws"),經過iconv轉碼從utf8到gb2312後,賦值給$b,結果判斷語句$a == $b 竟然是false!

首先我的資料庫一定是支援不換行空格的字符集(我的資料庫是utf-8編碼的)在庫中存的變數$a實際上是car[不換行空格]ws。程式取出變數$a後中間就帶有了不換行空格,再經過iconv轉換後,不管是使用//ignore,//translit,還是不做任何處理,它們兩個都不可能是相等的了。

於是就知道了解決辦法,在轉碼之前先做一次replace操作,否則轉碼後就是不可逆的了。

$a = str_replace(" ", " ", $a);

於是我和我的小朋友們不用再鬱悶了。

python print 不換行 沒空格

python2.7中測試 列印常量 數字 字串等 print 123 111 123111 print 123 123 123123列印變數 a 111 b 222 print a,b 111222 print ab traceback most recent call last file inde...

Python print輸出不換行沒空格

今天在做程式設計題的時候發現python的print輸出預設換行輸出,並且輸出後有空格。題目要求輸出 而我的輸出是 果然,不換行了,但是輸出結果仍然不對,要求輸出為122,而我的輸出為1 2 2 print i,end 但是我發現編譯錯誤,因為我用的是python2,跑python2 的print是...

CSS換行不換行

段落文字不超出幾行,超出部分以省略號顯示 一 div內顯示一行,超出部分用省略號顯示 white space nowrap overflow hidden text overflow ellipsis 二 div內顯示兩行或三行,超出部分用省略號顯示 overflow hidden text ove...