none
針對特殊字,微軟有整套的解決方案嗎? RRS feed

  • 問題

  • 大家好,小弟服務的是學校單位電算中心,整套的資訊系統都是採用微軟的解決方案,

    但是針對特殊字卻無好的解法,目前僅能以nvarchar的方式輸入SQL server,在網頁上呈現ok,

    但是又常常遇到user反應unicode的編碼讓他們網頁變成空白...

    而在VB6,.Net 2005上輸出時及Crystal report報表,也變成是問號的情況,

     

    想問一下大家,你們有遇過特殊字的問題嗎?有何建議的解決方案?

    由於學生資料上萬,父母都希望自己小孩好命有成就,所以特殊字一堆的情況真的頗多...= =

    請大家分享一下吧,謝謝!

    2007年4月17日 上午 02:35

解答

  • 您好:
    以戶政系統來說,除標準的中文標準交換碼一~七字面,還使用了其他額外的字面,雖然其系統是使用 4-Byte EUC 編碼,跟我們在 Windows 所用的 Unicode 不同。由於其系統強制規定必須使用相同的編碼,因此不論是在後端資料庫,前端的呈現(就是您到戶政事務所去申辦各項戶政事務時,那些戶政人員所使用的 IE 瀏覽器),皆是前後一致,並不會出現問號或網頁空白的情況。舉這個例子是要說明,中文字碼萬碼奔騰,不強制大家所用的編碼,當然會出現雞同鴨講的問題。即便是全部都採用微軟的解決方案,問題還是一樣,並不會因為採用了微軟的解決方案就得以解決。
    2007年4月17日 上午 03:39
    版主
  • Unicode 是全球針對各國語言的通解,不論是現在或未來,都是最好的選擇。

     

    一般網頁是用 utf8 來處理 Unicode 網頁,你只要有妥善的在網頁頭寫入正確的編碼,系統輸出正確的編碼,我還沒碰過會發生網頁空白的,當然,也有另一種可能,他們網頁瀏覽器使用強制指定編碼,未使用自動編碼,例如 IE 選單 檢視 編碼 自動選擇要勾起來,不要強制設定為 big5。

     

    Crystal report報表 並不是微軟的解決方案,微軟的解決方案是 SQL Server 附的 Reporting Service,Crystal report報表 只是伴隨 Visual Studio 協力廠商的元件,是屬於 ANSI Window ,並非 Unicode Window ,這類國外軟體不支援 Unicode 的情形滿多見的,歐美還是有很多軟體廠商只想吃英語系的市場,特別科學類的軟體,幾乎都不支援 Unicode ,針對 ANSI Window ,國內有作者整理 Unicode 補完計畫,在 big5 <-> Unicode 對照表上增加 5xxx 多字,屬於 Unicode 2.0 版本。

     

    在 Windows 2k/XP/2003 上,微軟曾在 2004/4 ~ 2004/12 間,在微軟下載中心開放 Unicode 3.1 下載(或從政府生產力光碟取得),Vista 則內建 Unicode 5.0 (此處版本為國際定義的 Unicode 版本,就好比 SQL92/SQL99/SQL2003) ,將原先 Unicode 2.0 的五萬多字,升級到 Unicode 3.1 的 7 萬多字,在升級到 Unicode 5.0 (忘了幾萬字,好像 10 萬字) ,台灣官方的 CNS11643 則動作太慢,一直沒跟上來,所以這也是沒辦法的。

     

    以國際接軌為前題時,用 Unicode ,以國內行政系統為前題時,用 CNS11643 (http://www.cns11643.gov.tw/web/index.jsp) ,用 CSN11643 時,由於各行政單位自己玩自己的,最好先洽詢上層主管機關,比如說各縣市政府會有公告該單位由 CNS11643 衍生的字型庫彙整、經濟部下的水利署、工業局都有各自的匯整,其實滿亂的,考慮到交換檔案時,最好依據主管機關的字形庫,不要自己玩自己的,我印象中教育部也有匯整,跟縣市政府不太一樣。

     

    你的問題比較偏向程式設計,我建議你看看下面的文章。

    這是我先前整理的:http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1538.entry


    2007/1/22

    [VB] Unicode 概述

    常常在論壇上看到很多人問 Unicode 的問題,這邊整理一些基本觀念給大家參考。
     
    Unicode 並不是一開始就有,所以會出現的問題就是以前跟現在相容的問題。早期只有 ANSI 編碼,各國配合自己需求,在 ANSI 下加入自己的編碼需求,例如 big5、gb2312、Japanese、ASCII 等,所以常常容易混淆,事實上都是在 ANSI 下為基礎。
     
    而 Windows 就分成兩種視窗,一種是以 ANSI 為基礎的,一種是以 Unicode 為基礎的,在 API 上的差異就是以 A 結尾的代表 ANSI ,以 W 結尾的,代表 WideChar(寬字元),也就是 Unicode ,又稱 ucs2。而 ANSI Window 是以地區預設語系顯示,也就是 控制台 地區及語言選項 進階 那個地區設定。
     
    使用者界面
    若是使用 Unicode Window 時,該視窗本身就直接支援 Unicode ,無須任何轉換,例如 .Net 下是使用 Unicode Window ,所以直接支援 Unicode ,但是若是在 .Net 下插入 COM 元件或是 VB6 的控制項,則要看該元件本身是採用 ANSI Window 或是 Unicode Window 。
     
    而在一般的 ANSI 要支援 Unicode ,全部是沒有,但只針對日韓簡罕倒是可以安裝 Unicode 補完計畫,此軟體並非是讓 ANSI Window 變成 Unicode Window ,而是在 big5 對照表上增加 big5 碼與 Unicode 碼的對應 5 千餘字,使得 ANSI Window 上所採用的字碼能對應到 Unicode ,則在 Windows 2000/XP/2003 下正常可顯示,所以超出這個對照表外的字也是沒有。
     
    若在 VB6 內想要使用 Unicode ,可以使用 Office 提供的 Forms 2.0 ,Forms 2.0 所有的控制項都是使用 Unicode Window,所以就直接支援 Unicode ,而 VB5/6 在記憶體中,均使用 Unicode ,就沒有轉換的問題。
     
    檔案
    無論在 VB6 還是 VBNET 下,文字檔的存取預設均是使用 ANSI ,這個應該是為了過去相容的考量,所以預設值採 ANSI ,其他編碼方式均需使用 byte() 陣列方式讀入檔案,再做編碼轉換,若是 Unicode 格式,在 VB6 無需轉換,其他格式則用 MultiByteToWideChar 轉成對應的字元,在 VBNET 則是使用 Encoding 來進行轉換,若是使用了錯誤的編碼格式,在 VB6 只是無法正確顯示,仍可經由轉換成正確的格式顯示,但是在 VBNET 會把錯誤的編碼過濾掉,再轉換就會掉碼,亦即,VB6 可以將一段 UTF8 的字串存在字串變數內,但是在 VBNET 則會發生漏字。
     
    網頁與資料庫
    瀏覽器依照 w3c 要求,允許將字碼頁以外的字元採用 &#nnnnn; 來傳遞,瀏覽器會自動編解碼。所以很多網頁系統並非真的支援日韓繁簡罕,但是可透過瀏覽器功能達成支援,但在寫入資料庫後,就會變成一串串的&#nnnnn; 無法做更進一步的應用,VBNET 寫 ASPNET 可以採用 UTF8 編碼來達成完整支援 Unicode ,asp 就會困難重重。
     
    在論壇上有一些相關討論,將連結摘錄如下:
    2007年4月17日 上午 05:34
  • 你是指 Unicode 2.0/3.1/5.0 包含的罕用字還是自己造的字?

     

    若是 Unicode 的部份,你可以在現在這個網頁上打,你打的出來的都 OK 。ASP.NET 預設就是 UTF8 ,不調設定的話,預設就可以解決。

     

    比如說游錫堃的堃。

     

    若是自造字,一般是提供字形檔給瀏覽者下載安裝,當然你可以考慮崁入網頁的字型樣式指定,不過那樣會造成每次瀏覽都要耗用那個流量,但是好處是使用者不須強制安裝你的字型,各有優缺點。

    2007年4月18日 上午 12:36

所有回覆

  • 您好:
    以戶政系統來說,除標準的中文標準交換碼一~七字面,還使用了其他額外的字面,雖然其系統是使用 4-Byte EUC 編碼,跟我們在 Windows 所用的 Unicode 不同。由於其系統強制規定必須使用相同的編碼,因此不論是在後端資料庫,前端的呈現(就是您到戶政事務所去申辦各項戶政事務時,那些戶政人員所使用的 IE 瀏覽器),皆是前後一致,並不會出現問號或網頁空白的情況。舉這個例子是要說明,中文字碼萬碼奔騰,不強制大家所用的編碼,當然會出現雞同鴨講的問題。即便是全部都採用微軟的解決方案,問題還是一樣,並不會因為採用了微軟的解決方案就得以解決。
    2007年4月17日 上午 03:39
    版主
  • Unicode 是全球針對各國語言的通解,不論是現在或未來,都是最好的選擇。

     

    一般網頁是用 utf8 來處理 Unicode 網頁,你只要有妥善的在網頁頭寫入正確的編碼,系統輸出正確的編碼,我還沒碰過會發生網頁空白的,當然,也有另一種可能,他們網頁瀏覽器使用強制指定編碼,未使用自動編碼,例如 IE 選單 檢視 編碼 自動選擇要勾起來,不要強制設定為 big5。

     

    Crystal report報表 並不是微軟的解決方案,微軟的解決方案是 SQL Server 附的 Reporting Service,Crystal report報表 只是伴隨 Visual Studio 協力廠商的元件,是屬於 ANSI Window ,並非 Unicode Window ,這類國外軟體不支援 Unicode 的情形滿多見的,歐美還是有很多軟體廠商只想吃英語系的市場,特別科學類的軟體,幾乎都不支援 Unicode ,針對 ANSI Window ,國內有作者整理 Unicode 補完計畫,在 big5 <-> Unicode 對照表上增加 5xxx 多字,屬於 Unicode 2.0 版本。

     

    在 Windows 2k/XP/2003 上,微軟曾在 2004/4 ~ 2004/12 間,在微軟下載中心開放 Unicode 3.1 下載(或從政府生產力光碟取得),Vista 則內建 Unicode 5.0 (此處版本為國際定義的 Unicode 版本,就好比 SQL92/SQL99/SQL2003) ,將原先 Unicode 2.0 的五萬多字,升級到 Unicode 3.1 的 7 萬多字,在升級到 Unicode 5.0 (忘了幾萬字,好像 10 萬字) ,台灣官方的 CNS11643 則動作太慢,一直沒跟上來,所以這也是沒辦法的。

     

    以國際接軌為前題時,用 Unicode ,以國內行政系統為前題時,用 CNS11643 (http://www.cns11643.gov.tw/web/index.jsp) ,用 CSN11643 時,由於各行政單位自己玩自己的,最好先洽詢上層主管機關,比如說各縣市政府會有公告該單位由 CNS11643 衍生的字型庫彙整、經濟部下的水利署、工業局都有各自的匯整,其實滿亂的,考慮到交換檔案時,最好依據主管機關的字形庫,不要自己玩自己的,我印象中教育部也有匯整,跟縣市政府不太一樣。

     

    你的問題比較偏向程式設計,我建議你看看下面的文章。

    這是我先前整理的:http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1538.entry


    2007/1/22

    [VB] Unicode 概述

    常常在論壇上看到很多人問 Unicode 的問題,這邊整理一些基本觀念給大家參考。
     
    Unicode 並不是一開始就有,所以會出現的問題就是以前跟現在相容的問題。早期只有 ANSI 編碼,各國配合自己需求,在 ANSI 下加入自己的編碼需求,例如 big5、gb2312、Japanese、ASCII 等,所以常常容易混淆,事實上都是在 ANSI 下為基礎。
     
    而 Windows 就分成兩種視窗,一種是以 ANSI 為基礎的,一種是以 Unicode 為基礎的,在 API 上的差異就是以 A 結尾的代表 ANSI ,以 W 結尾的,代表 WideChar(寬字元),也就是 Unicode ,又稱 ucs2。而 ANSI Window 是以地區預設語系顯示,也就是 控制台 地區及語言選項 進階 那個地區設定。
     
    使用者界面
    若是使用 Unicode Window 時,該視窗本身就直接支援 Unicode ,無須任何轉換,例如 .Net 下是使用 Unicode Window ,所以直接支援 Unicode ,但是若是在 .Net 下插入 COM 元件或是 VB6 的控制項,則要看該元件本身是採用 ANSI Window 或是 Unicode Window 。
     
    而在一般的 ANSI 要支援 Unicode ,全部是沒有,但只針對日韓簡罕倒是可以安裝 Unicode 補完計畫,此軟體並非是讓 ANSI Window 變成 Unicode Window ,而是在 big5 對照表上增加 big5 碼與 Unicode 碼的對應 5 千餘字,使得 ANSI Window 上所採用的字碼能對應到 Unicode ,則在 Windows 2000/XP/2003 下正常可顯示,所以超出這個對照表外的字也是沒有。
     
    若在 VB6 內想要使用 Unicode ,可以使用 Office 提供的 Forms 2.0 ,Forms 2.0 所有的控制項都是使用 Unicode Window,所以就直接支援 Unicode ,而 VB5/6 在記憶體中,均使用 Unicode ,就沒有轉換的問題。
     
    檔案
    無論在 VB6 還是 VBNET 下,文字檔的存取預設均是使用 ANSI ,這個應該是為了過去相容的考量,所以預設值採 ANSI ,其他編碼方式均需使用 byte() 陣列方式讀入檔案,再做編碼轉換,若是 Unicode 格式,在 VB6 無需轉換,其他格式則用 MultiByteToWideChar 轉成對應的字元,在 VBNET 則是使用 Encoding 來進行轉換,若是使用了錯誤的編碼格式,在 VB6 只是無法正確顯示,仍可經由轉換成正確的格式顯示,但是在 VBNET 會把錯誤的編碼過濾掉,再轉換就會掉碼,亦即,VB6 可以將一段 UTF8 的字串存在字串變數內,但是在 VBNET 則會發生漏字。
     
    網頁與資料庫
    瀏覽器依照 w3c 要求,允許將字碼頁以外的字元採用 &#nnnnn; 來傳遞,瀏覽器會自動編解碼。所以很多網頁系統並非真的支援日韓繁簡罕,但是可透過瀏覽器功能達成支援,但在寫入資料庫後,就會變成一串串的&#nnnnn; 無法做更進一步的應用,VBNET 寫 ASPNET 可以採用 UTF8 編碼來達成完整支援 Unicode ,asp 就會困難重重。
     
    在論壇上有一些相關討論,將連結摘錄如下:
    2007年4月17日 上午 05:34
  • 那請問大家有在系統上實作過嗎?並在server端與client端的Grid、報表、顯示的相關控件上有完全的解決方案?

    並建議在微軟工具下應該採取哪些策略與工具來實現?謝了。

    如果真的微軟的工具無法完整解決,有第三方開發的套件可以用嗎?

     

    再請各位給些建議,謝謝。

    2007年4月18日 上午 12:25
  • 你是指 Unicode 2.0/3.1/5.0 包含的罕用字還是自己造的字?

     

    若是 Unicode 的部份,你可以在現在這個網頁上打,你打的出來的都 OK 。ASP.NET 預設就是 UTF8 ,不調設定的話,預設就可以解決。

     

    比如說游錫堃的堃。

     

    若是自造字,一般是提供字形檔給瀏覽者下載安裝,當然你可以考慮崁入網頁的字型樣式指定,不過那樣會造成每次瀏覽都要耗用那個流量,但是好處是使用者不須強制安裝你的字型,各有優缺點。

    2007年4月18日 上午 12:36
  • 抱歉可能沒有說的很清楚,

    在網頁上的確很容易達成罕見字的顯示,不過如果要在windows Form上做,

    就會遇到您所提到的元件是否支援unicode的問題,

     

    只是想了解在微軟推出的工具之中,是否有解決這問題的整套解法。

     

    2007年4月18日 上午 12:46
  • 上面那篇不就講了,VSNET 核心就是全面改用 Unicode Windows ,所以跟 IE 一樣,只要是 Unicode 2.0/3.1/5.0 包含的字,不用改就支援了,自己造的字則要透過字型檔支援。常用的類似狀況包含條碼,只要用條碼字型就直接可以在視窗或網頁上用條碼了。我看你前面有寫到 VB2005 ,你在 VB2005 就直接可以輸入罕用字了。

     

    你若是針對的是開發,建議你到隔壁討論區:

    http://forums.microsoft.com/msdn-cht/default.aspx?siteid=14

     

    搜尋 Unicode ,那邊有很多篇現有討論,上面那篇有連結的是我有參與的討論,還有其他篇相關討論。

     

    隔壁討論區著重的是開發技術討論,這邊著重的是操作、管理技術討論。

    2007年4月18日 上午 01:03