2009年6月8日 星期一

亂碼的形成

延伸判斷字串內是否有中文字的話題,有人問到了是否可以判斷亂碼的存在?

我知道亂碼的產生原因有兩種

1. 不知道原有的編碼,而以非原編碼來檢視文件。

例如由判斷字串內是否有中文字例中產生的 all.txt文件 (unicode編碼),以ultraedit 打開來檢視 (會以 ANSI 編碼 打開),就會看到不一樣的文字。

由於這些文字顯示時並非預期的樣子,常常看不懂,俗稱亂碼。

這個文件並非亂碼,只是用錯了編碼來檢視文件。因此只要找到了正確的編碼來檢視即可。

clip_image002 clip_image004

        2. 資料儲存體 (storage) 無法支援編碼。例如 sql datatype varchar(50) 存入了王建煊,因為煊存入後會遺失資料,導致讀出時,煊變成了?。

?或方格等,是指無法顯示的字,因此也是亂碼常見的癥狀。

舉例來說,all2.txt 是 all.txt 以 ANSI 編碼另存來的。在儲存時會出現下面的警告。

clip_image006

強迫儲存後,分別找到 29002 的地方,就會發現 ANSI 的字變成了?

clip_image008clip_image010

再以 UltraEdit 來比較,發現兩邊儲存時的不同。「煊」在unicode 存儲成 4A71,而在 ANSI 只存了 3F。

image image

由於亂碼的形成原因不一,因此也難以判斷進而偵測亂碼的存在。

沒有留言:

Share with Facebook