Windows造字程式與字元對應表之字型無法匹配問題
今天發現一個超詭異的現象,就是Windows造字程式
(EudcEdit.exe)與字元對應表
(CharMap.exe)明明確定是同一組字碼,卻出現不同形狀的字符,簡單的說就是文字根本不一樣。
Windows造字程式與字元對應表裡面的文字不一致
經過抽絲剝繭後發現,字元對應表似乎會將造字後的檔案快取起來,舉例來說,我們在已經出問題的電腦
裡面打開字元對應表
,FA40
看到了一個文字假設是堃
,然後我們打開了Windows造字程式
,在FA40
將原本的堃
改了新的造字尛
,然後存檔,又去字型連結裡面連結所有的字型,看起來一切都很完美。
但最終的結果是,造字程式的FA40
的確顯示尛
,但字元對應表顯示的卻是堃
。
文字不一致會造成怎樣的問題?
現代是瀏覽器的時代,為了罕見字有時候我們會請使用者端下載造字檔案放到自己的電腦(更新造字字型檔),然後瀏覽器透過CSS設定font-family: EUDC;
來調用客戶端的系統造字來顯示文字。
而這個文字不一致的問題會形成很嚴重的問題,那就是:明明我已經下載更新造字檔案,罕見字為什麼顯示不出來?(或者是顯示成不對的文字)
,接下來就是程式設計師跟使用者互相指責的時間了。
證明字元對應表有建立快取
如果你有跟上述描述的情況一樣,可以透過這個方式證明。
- 將
C:\Windows\Fonts
字型資料夾裡面的eudc*.*
全部砍掉。 - 重新開機。
- 打開
Windows造字程式
發現,因為沒有造字檔所以確定是空白。 - 打開
字元對應表
後你會發現,先前的造字依然顯示在上面。
由上面的步驟4可以得知,系統的造字檔案明明都砍了,怎麼還會看到先前的造字,一定有快取。
字元對應表的快取放在哪裡?怎麼刪除?
理論上是放在下方目錄,檔名會以EUDC*.tte
呈現,例如:eudc.tte、eudc_0.tte、eudc_1.tte...
C:\Users\YourUserName\AppData\Local\Microsoft\Windows\Fonts
用系統管理員的權限
進來這個目錄下,基本上裡面的檔案全部都會被系統鎖定,所以你只能依照古老的造字替換大法來移除,也就是先改檔名(例如eudc.tte.bak)→重開機→再刪除。
觀察到的現象與結論
- 字型的
快取目錄
位於C:\Users\YourUserName\AppData\Local\Microsoft\Windows\Fonts
。 - 快取目錄下的字型檔案在系統開機時會被讀入到記憶體某處,也就是說當你把這個目錄下的
eudc.tte
更名成eudc.tte.bak
後,在重開機之前其實還是會顯示eudc.tte
的文字。 eudc.tte
更名成eudc.tte.bak
這個動作,必須在開機尚未執行任何程式或瀏覽網頁之前就進行,一旦執行了任何程式就有可能被栓鎖。- 當快取目錄
有造字檔案
時,系統會在適當的時機(例如執行字元對應表
或瀏覽具備造字CSS網站
)載入此目錄的造字拿去呈現在畫面上且檔案會被 栓鎖,這時候透過Windows造字程式
所新增修改的任何造字,其實都再也不關系統顯示造字的事情了,相當於系統永遠以快取目錄的造字檔案為主。 - 當快取目錄
沒有造字檔案
時,字元對應表
列表上不會有造字字型檔案顯示,也就是你看不到系統的造字列表了,除非進去Windows造字程式
裡面看。 - 當快取目錄
沒有造字檔案
時,系統會在適當的時機會去字型目錄C:\Windows\Fonts
拿造字檔案eudc.tte
,當然這個檔案就一定會被栓鎖。 - 當字型目錄
C:\Windows\Fonts
的造字檔案eudc.tte
被栓鎖,此時透過Windows造字程式
新增修改的任何造字並儲存,一律會顯示記憶體資源不足
及記憶體不足。請在其他處理程序完成後重試。
。 - 想要正確的新增修改造字檔案,又想要正確的顯示造字,請跟隨下列設定:
- 拋棄
字元對應表
程式,以後都在Windows造字程式
查閱造字。 - 清空字型
快取目錄
底下的EUDC字型檔案,因為它會讓後續更新造字的任何動作失去意義,除非你記得在每次更新造字後再花時間去更新它。 - 若要新增、修改造字請在開機後馬上處理,確定都完成後再去執行顯示造字能力的系統程式,例如:瀏覽器、記事本...等。
- 拋棄
相關參考
- 列舉Windows作業系統下的造字檔內的所有文字(粗略版)
- 列舉Windows作業系統下的造字檔內的所有文字(精準版)
- 找出字串中隱藏的Big5造字字元,並用Unicode將其取代
- 如何在在Excel中找出BIG5的使用者造字字元?
- 更新造字字型檔(EUDC Fonts)的批次小程式
- Windows造字程式與字元對應表之字型無法匹配問題