unicode
要修改表结构,比较麻烦.

解决方案 »

  1.   

    是不是将数据存储为nchar,nvarchar等unicode数据类型就可以解决了???
      

  2.   

    唉,怎么不去找竹之草回答过的帖子呢?
    About Unicode1. Guide line
    2. OS Setup
    3. MSSQL server setup
    4. Database Fields
    5. JDBC driver Setup
    6. Client Side Setup
    7. Report Coding
    8. OthersGuide Line:
    目的: 使我們的程式可以正常工作於簡繁體混合的運行環境中.本文將涵蓋涉及程式以及安裝環境的相關問題. Unicode 因為使用兩個byte存放不同文字的編碼,所以可以支持多語言, 即以unicode存放的文字可以顯示成為不同的語言種類,例如: 簡體中文, 繁體中文, 日文, 韓文,等等.
    每個語言中的字符在unicode中都有一定的編碼, 有一點需要注意, 我們就以簡體中文, 和繁體中文為例: 例如 ‘生’這個字, 在簡體中文, 繁體中文中都有, 但是因為簡體中文的”生”,和繁體中文的”生”,寫法一樣, 所以,在unicode 編碼中, “生”這個字的編碼只有一個, 如果寫法不一樣,在unicode 中就會有多個編碼. WindowsNT提供的unicode字元對應表,可以幫助你查看一個字體文件中不同字符得unicode 編碼, 如果你想知道一個字符得unicode, 你可以使用JDK中提供的一個工具 native2ascii.exe 去查看. 想讓我們的系統完全支持, 簡繁體混合得運行環境, 我們需要做到以下幾點:OS Setup
    此處的OS的類型風分兩種 Server 端,和Client 端Client 端支持的類型: 
    Windows 98簡體,
    Windows 98繁體 (需要額外安裝中文字庫,以包含於我們的安裝程式中)Windows NT4.0簡體, 
    Windows NT4.0繁體 (需要額外安裝中文字庫,以包含於我們的安裝程式中)
     
    Windows 2000簡體, 
    Windows 2000繁體 (需要額外安裝中文字庫,以包含於我們的安裝程式中)Windows ME簡體.
    Windows ME繁體 (需要額外安裝中文字庫,以包含於我們的安裝程式中)Server 端支持的OS類型
    Windows NT4.0 Server簡繁體.
    Windows2000簡繁體.MSSQL server setup本文只提供SQL7得做法: SQL7中已經支持了unicode ,就是說如果你表的某個欄位,是使用nvarchar, nchar, or ntext etc, 那麼,存放在這個欄位中的字符將都是使用unicode 編碼.為了更好的支持 Unicode 得處理方式, SQL7 建議:在安裝過程中, 1: code page 選擇 cp936 (這樣可以兼容程序中insert, update sql沒帶 N的部分 如果code page 是cp950 或者 cp1252,則程式中不帶N的insert 和 update 會造成 存入db中的資料不是unicode.2: 如果你在安裝SQL7得過程中code page沒選擇cp936,而是使用了cp950或者cp1252, 那麼請確保你程式中的insert 和update的語句都有N,以保證這些程式插入資料庫的漢字是unicode.3: SQL其他部分的安裝請參考 NetBizSoft  SQL Server setupDatabase Fields
    凡是需要存儲漢字的欄位,在MSSQL7中請一率使用使用 nxxxx類型,以支持unicode, Install和 init資料庫的腳本中插入漢字的地方一律加 N
    JDBC driver Setup我們使用i-net SPRINTAJDBC 2.0 Driver 這個Driver對unicode 支持的不錯, 在一般情況下,JDBC driver 經過設定都會對經過其傳送的字符進行編碼,
     By default character converting is disabled. 
    for example: "jdbc:inetdae:localhost:1433?charset=Cp1250"
    jdbc:inetdae:localhost:1433?charset=sun.io.ByteToCharConverter.getDefault().getCharacterEncoding()
    jdbc:inetdae:localhost:1433?charset=" + System.getProperty("file.encoding");
    "jdbc:inetdae:localhost:1433?charset=" + (new java.io.InputStreamReader(in)).getEncoding();
    我們現在使用的Cp950就是繁體中文的編碼. i-net SPRINTAJDBC 2.0 Driver 是支持unicode
    只要我們將charset=cp950 換成 sql=7,這樣,經過JDBC得driver將自動傳遞unicode,
    Client Side SetupJava Application, 大家都知道java 是支持unicodede的, 但是在某種作業系統上, 例如繁體中文的作業系統顯示簡體中文的字符時, 即便需要顯示的中文字符是unicode編碼, Java Runtime 仍然需要一種包含這個字符unicode 編碼得 字體來正確顯示這個字符, 我們之所以在繁體中文上看不到有些簡體中文, 就是因為繁體中文使用的字體文件中沒有包含簡體字符得unicode 編碼, 但是也有一些簡體中文我們可以看見,那是為什麼?,前面已經提到了, 是因為這些可以正確顯示的簡體中文,和相應的繁體中文的寫法是一樣的, 也就是說繁體字體文件中已經包含了這些編碼.那麼如何在繁體的java runtime 中使用additional 的字體文件? 這個問題也就是我們解決簡繁體混合運行環境的關鍵, 我們有兩種方法在java runtime 中使用額外的字體文件:1: 更改font.properties 文件 在你安裝的JDK或者是JRE的目錄下, 有很多font.properties.*文件,那麼java runtime 會使用那個font.properties ?, 原來java runtime 是根據作業系統的設定, 按照以下的先後順序去使用
    font.properties 文件的: JavaHome/lib/font.properties.Language_Country_Encoding.OSVersion
    JavaHome/lib/font.properties.Language_Country_Encoding.OS
    JavaHome/lib/font.properties.Language_Country_Encoding.Version
    JavaHome/lib/font.properties.Language_Country_Encoding
    JavaHome/lib/font.properties.Language_Country.OSVersion
    JavaHome/lib/font.properties.Language_Country.OS
    JavaHome/lib/font.properties.Language_Country.Version
    JavaHome/lib/font.properties.Language_Country
    JavaHome/lib/font.properties.Language_Encoding.OSVersion
    JavaHome/lib/font.properties.Language_Encoding.OS
    JavaHome/lib/font.properties.Language_Encoding.Version
    JavaHome/lib/font.properties.Language_Encoding
    JavaHome/lib/font.properties.Language.OSVersion
    JavaHome/lib/font.properties.Language.OS
    JavaHome/lib/font.properties.Language.Version
    JavaHome/lib/font.properties.Language
    JavaHome/lib/font.properties.Encoding.OSVersion
    JavaHome/lib/font.properties.Encoding.OS
    JavaHome/lib/font.properties.Encoding.Version
    JavaHome/lib/font.properties.Encoding
    JavaHome/lib/font.properties.OSVersion
    JavaHome/lib/font.properties.OS
    JavaHome/lib/font.properties.Version
    JavaHome/lib/font.properties那麼 font.properties 到底包含什麼內容:以下是個簡單的介紹,以font.properties.zh_TW為example
    詳細內容見專門的文檔# @(#)font.properties.zh_TW 1.16 00/10/06
    # AWT Font default Properties for Traditional Chinese Windows 
    在java中使用的字體是虛擬的字體,包括dialog, serif等,這些字體是通過font.properties文件和作業系統中的具體字體對應起來的, 
    dialog.plain.0=Arial,ANSI_CHARSET
    dialog.plain.1=\u7d30\u660e\u9ad4,CHINESEBIG5_CHARSET,NEED_CONVERTED
    dialog.plain.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
    dialog.plain.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED
    0,1,2,3,表示了對應的搜順序, 就是如果在第一個font 文件中找不到相關的unicode 就到下一個對應的文件中去找,以次類推sansserif.bold.0=Arial Bold,ANSI_CHARSET
    …# font filenames for reduced initialization time
    #在這裡指定前面我們在把虛擬的字體對應到實際字體時, 使用的字體名稱對應的字體文件
    filename.\u7d30\u660e\u9ad4=MINGLIU.TTC
    filename.\u65b0\u7d30\u660e\u9ad4=MINGLIU.TTC
    filename.Arial=ARIAL.TTF# Default font definition
    #這裡說明的是如果沒有找到相關的unicode 那麼該顯示什麼字符號,2751是一個方框
    default.char=2751 大概知道了font.properties文件的內容, 我們就可以增加一種字體到運行環境中了,只要這種字體文件,包含了程式中使用得unicode  編碼所對應的文字,那麼我們的程式就可以正確顯示不同編碼的漢字了,現在我們採用的是Microsoft比較齊全的亞洲字體文件2: 在程序中指定需要使用的字體文件
    從指定的位置讀取相關的字體文件, 使用Jdk1.3提供的Font.createFont方法動態構造一個Font       File f = new File("y:\\temp\\Simsun.TTC"); //SimSun.TTC是一種比較齊全的unicode文件
           FileInputStream fis = new FileInputStream(f);
           Font z = Font.createFont(Font.TRUETYPE_FONT,fis);
           Font f1 = z.deriveFont(Font.PLAIN,20f);
           fis.close();把這個Font 指定給相關的component ,TextField, TextArea, 僅僅這樣JavaRuntime仍然不可以正確顯示, 你還需要指定作業系統的國家的設定為English(US/Canada/…), 或者只在jre/lib目錄下只保留font.properties 文件.