1. 程式人生 > >UTF-8轉GBK的悲劇:特殊字元C2A0

UTF-8轉GBK的悲劇:特殊字元C2A0

這個問題出現得比較早:在傳給印象派的作品描述XML(GBK編碼)中一些文字資訊經常包含亂碼,而且會一亂到底,甚至導致不同頁的錯亂。剛開始一直都沒有什麼頭緒,不過後來終於發現了部分頭緒:GBK的字符集過小,對一些特殊字元的轉碼會出現亂碼—-一些生僻字也就算了,但是其中卻包括這個字元:C2A0—-一個在網頁上經常使用排版用全形空格。就是這麼個字元,使用者從網頁端拷貝了一段文字,複製到介面上顯示正常,儲存到作品XML檔案中(UTF8編碼),顯示正常。但是上傳作品時由於將相應的XML編碼格式轉換成GBK,於是出現了亂碼……
處理方法:

方法一:轉換時對文字資訊做特殊處理,用0×20代替掉0xC2A0。

方法二:作品XML檔案直接以UTF8編碼傳輸。

方法一有點頭疼治頭腳疼治腳的味道,雖然解決了這個問題,但是總歸不夠規範不夠完美—-很多頁面都是這麼做。而方法二則需要伺服器支援,但可以完美的解決這個問題。以前伺服器之所以用GBK編碼很大的理由可能在於GBK相對UTF8更省空間—-在這麼個硬碟空間足夠,頻寬足夠的現狀下,節約出來的那麼點東西又有什麼用呢?

/**
	 * 
	 * 將不換行空格(NO-BREAK SPACE,Unicode 0x00a0,UTF-8編碼:0xC2A0)替換為普通空格。
	 * 
	 * 用於避免因資料庫字符集不相容導致這個字元變為問號“?”的情況。
	 */

	public static String nobreakSpaceToSpace(String str) {
		if (str == null) {
			return null;
		}
		char nbsp = 0x00a0;
		return str.replace(nbsp, ' ');
	}