2012年7月30日 星期一

Tradestation 2000i使用教學---MetaSever 與DDE設定


MetaSever為接受價格資料然後餵給GlobalSever,DDE則是即時價格資料來源,一般的報價軟體皆有提供。
安裝MetaSever
1.安裝MetaSever相當簡單,基本上只要依照系統指示一直按"下一步"即可。

2.第一次啟動系統會要你提供MSRT.KEY,只要依指示指向這個檔案即可。
 
Excel與DDE設定(以統eVIP為例)
1.統eVIP的DDE功能僅限專業版,要另行申請。在功能列=>客戶服務=>DDE EXCEL可以開啟DDE功能視窗,接下來依下圖所示,我們將台指期07DDE資料傳送至EXCEL。

2.在輸出的EXCEL裏我們就可以觀察到價格資料會即時自動更新,這就是DDE的主要用處,為了方便管理此時我們可以另外開啟一個新的EXCEL檔(取名DDE),專門整理所有商品的DDE(將輸出的DDE儲存格公式複製過去即可)。依此類推,將想要收集的商品價格DDE全部整理到DDE.xls(xls為Excel的附檔名)檔中。

 
MetaSever設定
完成了整理DDE的EXCEL檔,接下來就是讓MetaSever正確去讀取在EXCEL中各個商品價格的正確儲存格,設定如下:
1.在MetaSever功能列裡面點"Add new symbol",開啟商品設定視窗(Symbol configuration),接下來依序作如下設定:
  • Symbol name:輸入商品名稱,注意一定要與GlobalSever中取的名字一樣。
  • DDE:鍵入excel.exe。
  • Trade recod:接下來就是要勾選要MetaSever要收集哪些資料,比如成交價成交量買賣價等等,其中成交價也就是Trade record一定要勾,勾了後點擊右側的小框框,會出現細部設定視窗,在DDE Tops中輸入前面我們用來整理DDE的EXCEL檔名,也就是DDE.XLS;接下來DDE Item一欄比較複雜,範例圖示中我們鍵入r2c2所代表的意思就是抓取DDE.xls檔案中第二列(Row)第二欄(Column)儲存格的內容,同理如果是要抓第三列第二欄的資料就應鍵入"r3c2",接著按確定即完成TXC1台指期的MetaSever設定。

2.如果要設定多個商品,可使用"Copy selected symbol setting"的功能,複製已設定好的設定,從中再改新增商品的Symbol Name等設定,以減低設定花費時間。
  • 點選欲複製的商品
  • 滑鼠點擊如下圖所示之功能鈕,即可開啟一個新商品設定視窗。

 

Tradestation 2000i使用教學---GlobalSever

GlobalSever主要功能是負責管理商品資料的規格設定以及作為價格資料庫。在整個TS的設定與使用中是最為繁瑣難懂的一塊,此外2000i的GlobalSever尚有些小Bug,在吳子靖的交易操盤大師」中也花費相當篇幅去說明。我們將分下面幾個小單元來一步步解說GlobalSever:

GlobalSever Setup Wizard(安裝精靈)
安裝完TradeStation2000i主程式後,請接著安裝MetaSever(MetaSever安裝與設定另有獨立單元介紹)。第一次執行GlobalSever會先進入GlobalSever Setup Wizard(安裝精靈),畫面如下:
1.GlobalSever Setup Wizard畫面,按下一步

2.這個選項請選後者,接收即時資料。

3.這個選項請選"DBC Online SubSever"

4.這個選項請選"No"。

5.完成GlobalSever Setup Wizard後,系統會進入GlobalSever畫面,選擇"Start Online"開始即時行情。

6.由於我們已經先裝了MetaSever,所以此時系統會自動呼叫MetaSever,關於MetaSever與DDE設定請看後面章節介紹,此時可先不予理會。

7.系統有預設一些商品(Symbol),建議可以刪除(Delete Symbol)

以上,我們就完成了GlobalSever的精靈設定。
 
GlobalSever使用介面簡介
1.Symbol Portfolio
也是GlobalSever的預設主畫面,這裡可以一覽你的Portfolio中所有商品,檢查即時價格是否有連接(Real-Time Status為Connected狀態),按右鍵便可執行"新增商品(Insert Symbol)"、"編輯商品(Edit Symbol)、刪除商品(Delete Symbol)、匯出價格資料(Export Data)、匯進價格資料(Import Data)、連接即時價格資料(Connect Symbol)等商品管理主要功能。

2.Performance
這邊主要是確認即時資料有沒有傳送,在"Quotes received"這一欄裡,只要數字有跳動,表示即時資料有傳進來。

設定商品規格資料庫(Edit Symbol Dictionary)
修改商品資料庫事件瑣碎費時的工作,建議可以將別人設定好的資料庫拷貝過來,方法:複製已設定好的資料庫檔,路徑為C:\Program Files\Omega Research\Universe.mdb,到本機的相同位置,覆蓋舊檔。 
1.先至工具列Tools=>Edit Symbol Dictionary,打開Symbol Dictionary Setup視窗(見下圖),執行"Add Symbol",在Category to add選單中,選擇"Index"(此處不選"Futures"而選"Index",因為Futures商品設定較為複雜,我們一律把所有商品都設為"Index"會大幅簡化設定工作,另外由於我們在收期指價格資料多是收連續月的報價,將其視為"Index"也屬合理)。

2.設定商品規格
商品規格設定內容如下圖,依序鍵入相關規格資料即可。
  • Volume Multiplier及Price Multiplier這兩項是對資料源來的價格作加權設定,通常用在外匯商品,國內的商品用不到。
  • PriceScale指的是價格跳動格式,是整數來是十進位或是百進位(台指期選"As Is",電子期就是"1/100",金融期為"1/10",以此類推)。
  • Big Point Value則是指一大點的價格,台指期為200,電子期則是4000,金融期1000(注意Big Point Value不是指最小跳動點價格)。
     
  • Collect Daily Quotes等兩個項目是指要取收盤價後多久的價格當作當日收盤價,一般設2~5分鐘即可。
  • Session Times in exchange's local zone是填入交易時間,注意是填交易所當地時間。

3.修改商品規格
日後商品要修改商品規格一樣在Edit Symbol Dictionary裏,先鍵入該商品相關資料,按"Find"鍵,將該商品搜尋出來,然後按"Eddirt Symbol"即會呼叫出該商品的規格設定,直接修改即可。

 
新增商品到"Symbol Portfolio"(Insert Symbol)
1.功具列=>Insert=>Symbol

2.Add from Dictionary

3.先搜尋,再從近似的商品清單中挑選要的,加入(Add)即可。

匯入&匯出價格資料
匯入:
1.匯入前先取得歷史價格資料(XPO檔),存在電腦中。首先在GlobalSever的Symbol Portfolio中按滑鼠右鍵,Import Data=>GlobalSever format

2.Browse=>打開剛剛存下的XPO檔=>下一步。

2.,選擇要匯入的商品=>下一步。

3.選擇要匯入的時間價格=>下一步。

4.選擇要匯入的期間=>完成。

匯出:
1.先以滑鼠點選要匯出的商品=>Export Data=>GlobalSever format。

2.選擇要匯出的期間=>完成。

3.選擇要匯出的時間價格(如無必要,避免選1 Tick與Implied Volatility)=>下一步。

4.選擇匯出存檔的位置=>完成。

Tradestation 2000i使用教學---主程式安裝與設定

先用簡圖說明一下要讓Tradestation開始運作需要的安裝程式與設定:

TS主要有三個元件:TradeStation、GlobalSever以及EasyLanguage。TradeStation就是看報價、技術分析以及執行策略的平台;GlobalSever是個資料庫,負責管理價格資料;最後是EasyLanguage,讓你可以把自己的交易邏輯撰寫成程式語言,最後形成程式交易策略放到TradeStation去回溯、執行。
所以簡單來講整個安裝設定流程如下:安裝TS2000i主程式→安裝MetaSever→設定GlobalSever(Setup Wizard、商品規格設定 、匯入歷史資料)→MetaSever與DDE設定→開始使用TS2000i
整個安裝與設定的流程最複雜的部分在GlobalSever與即時資料連接,這部分我們放在後面獨立單元解說,這邊先簡要說明TS2000i安裝程式安裝的過程需要注要的小地方。
安裝TS2000i大致上輸完密碼後就是一直按"下一步"直到輸入完成,不過中間有些步驟系統會需要作選項選擇,建議選擇如下(注意:如安裝版本為 ProSuite 2000i版,流程與畫面稍有不同):
1.不要勾。這是安裝資訊源廠商安全鎖的驅動程式。

2.選YES,放棄下載。這是下載隱含波動率資料。

3.選NO,放棄使用PCQuote.com提供的30天試用程式。

4.選Other,稍後我們在GlobalSever Setup Wizard再作設定。

以上,完成TradeStation2000i主程式安裝!

談談 C#.NET 連結 DDE Server 的設計觀


DDE (Dynamic Data Exchange)?,這似乎已經是微軟過時的一種通訊傳遞的技術了。 但是只要是跑券商提供的看盤交易應用軟體,諸如 永豐 e-leader元大 yeswin日盛 hts 等,都必然有提供 DDE 連結的功能。 探究原因,Excel 肯定是佔最大的因素了,因為一般交易者可以很容易地透過 Excel,抓取看盤軟體正在跳動(Tick)的即時金融商品資訊,在不需要太懂程式設計語法的情況下,也能利用 Excel 強大的統計功能,或者利用簡單的 VBScript 語法,撰寫指標或統計數據等。
先前我就曾經利用 Excel 撰寫過即時的「漲/跌/平 家統計數據」了,詳見:「利用 Excel 實現權值成分的漲跌平家走勢圖」。 不過,目前我正在研究其中關於大盤即時 “量" 的變化,也就是觀察 Top-100 的期貨成份股,在每一分鐘內,統計所有即時跳動(Tick)的成交買價量與賣價量。 所以幾乎每一秒,只要一有跳動,就必須觸發(trigger)統計運算的邏輯,把 100 支以上的權值成份股整個迴圈跑過一次。 不知道是否因為我對 VBScript 不習慣,還是寫法有問題,在 Excel 內的處理效能上還是來得不佳,喔,甚至還曾幾次出現過當掉的現象,而這在即時看盤中,當然是很忌諱的 ; 另外,我也可能想要開發個能同時連多個報價來源 DDE Server 的 “中介(intermediate)" Server,除了可以方便調整想要擷取的資料來源外,還能兼容有 “容錯(fault-tolerance)" 的功能。 反正啊,能具有高度的客製化(customization),以及無限想像的延展性(scalability),更是我想要的,而這些當然就要寫程式自行來去開發擴展囉。
DDE 是個老舊的傳輸技術,從微軟官方的角度,係制訂了 DDEML (Dynamic Data Exchange Management Library) 的規格,並提供給 Developer 最高階的連接方式就是 Windows 32-bit 的 APIs(Application Programming Interfaces),在實際 Windows-32 的作業系統下,是被實作在 “User32.DLL"。 所以,最適合用來開發 DDE-based 的程式語言,當屬可以直接連接 Win-32 APIs 的,諸如 VB6, C++ 等,開發上對於 DDE 的實際連結,會來得容易許多。
anyway, 我還是喜歡利用 .NET C# 來寫程式,最主要只有一個原因,我對它比較熟悉!
而我在一般關於「程式交易討論區」看到有些網友發言,說 .NET 並不支援 DDE! 這句話初看到挺覺得奇怪的,其實正確地來講,應該是說 .NET Framework 並沒有提供 DDEML 的 Wrapper 成為 .NET 元件,所以若要從 .NET 應用程式連結 DDE Server 的話,就必須自行實作呼叫底層(相對於 .NET)的 Win-32 APIs。 一個簡單的流程如下:
  C#/VB .NET Client → .NET DDEML Object(自行撰寫,因為官方沒有提供) → Win-32 DDEML APIs
西方的一個老諺語: “Don’t Reinvent the Wheel (不要重覆再造輪子)。" 那個 .NET DDEML Wrapper 物件,是否要自行撰寫,有待商榷! 若要自行撰寫,那就確定了,是要從造一個新的輪子開始,而且還要很熟悉 DDE 相關的通訊細節才行! 建議啦,這類的 “輪子建設" 工作,先查詢一下 Google,這可是 Google 最大的功用! 發現到,其實真的已經有許多其他行家已經造好可以在 .NET 環境開發的 “DDE 連結 輪子" 了。 包括 美國、中國大陸、甚至日本等都有人在造。 而其中這個: NDde ,看來應該是最為完整的開源 (open-source)專案了。 還包括文件、範例,甚至原始碼等,是可以充分在 .NET 2.0 環境下執行的,下載回來解壓縮放置某一個目錄後 (ex. “\Program Files\Ndde"),把你的 .NET 專案 Add Reference 該目錄內有個 “NDde.DLL" 檔案即可。 這使得寫 C# DDE Client 變得相當簡單,我個人已測過連結 e-leader DDE 來源,完全沒有問題!
要透過 C#/VB .NET 撰寫連結 DDE Server 的 Client 端程式,只要參考 NDde 目錄內的 /Samples 範例檔即可。 另外底下是我自己先暫時寫的一個小小控制程式,主要是測試是否可以確實連結 DDE Server 並取得 Topic/Item 的回傳資料。

TDControl.cs

using System;
using System.Text;

using NDde.Client;

namespace TradeDDE.Control
{
    public class TDControl
    {
        private DdeClient client;

        public void Connect(string service, string topic)
        {
            client = new DdeClient(service, topic);

            try
            {
                // Connect to the server.  It must be running or an exception will be thrown.
                client.Connect();

                //Start Advise
                this.startAdvise(this.client);
            }
            catch (Exception thrown)
            {
                throw new Exception("無法連結 DDE Server \n" + thrown.Message);
             }
        }

        private void startAdvise(DdeClient client)
        {
            // Advise Loop
            client.StartAdvise("VolAmount", 1, true, 60000);
            client.Advise += OnAdvise;
        }

        private static void OnAdvise(object sender, DdeAdviseEventArgs args)
        {
            Console.WriteLine("OnAdvise: " + args.Text);
        }

        public void DisConnect() 
        {
            try
            {
                client.Disconnect();
            }
            catch (Exception thrown)
            {
                throw new Exception("無法離線 DDE Server \n" + thrown.Message);
            }
        }
    }
}
單元測試程式程式碼如下(利用 NUnit Test Framework),利用它可以先取代 UI Form 的執行,而直接觀察在 Console 的執行結果。
TDControlTest.cs

using System;
using System.Text;

using TradeDDE.Control;
using NDde.Client;
using NUnit.Framework;

namespace TradeDDE.Control.Test
{
    [TestFixture]
    public class TDControlTest
    {
        private TDControl control;

        [SetUp]
        protected void SetUp()
        {
            control = new TDControl();
        }

        [Test]
        public void tesConnect()
        {
            try
            {
                control.Connect("myapp", "myservice");
            }
            catch (Exception thrown)
            {
                Console.WriteLine(thrown.Message);
            }
        }
    }
}
順帶提一下 IDE 工具。 對於這類要自行開發小程式的開發工具而言,在 Java 這邊的首選當然就是 Eclipse (或者衍生的 EasyEclipse)。 .NET 這邊呢? Visual Studio .NET 2005/2008 這可是要付費的,而且還不便宜! 不過這兩三年來,微軟真是佛心來著,竟然也提供完全免費的 Visual Studio 2005/2008 Express 系列,雖然是 By 個別語言就要個別下載 (C#/VB .NET 各一套),但也真的夠用了,還是挺好用的呢。
screenshot_vs2008_express_c#
唯有一個美中不足的地方,MS 還是不夠大方,不允許 3rd party 在 vs express 的版本上 “加值",也就是無法撰寫 add-in 的擴充功能程式,"plug-in" 到 vs express 的平台上。 影響最大的是什麼呢? 你無法在 express 的環境內執行 unit-test,諸如下載回來的 NUnit,你只能在 IDE 的環境外,自行透過 NUnit 內建的 GUI 測試工具來測試,而如此就不容易與 IDE 的 DEBUG 機制整合在一起。
倒是也有另外一套非屬於 MS 的 .NET 開源專案— SharpDevelop,也是提供在 .NET 的 IDE 開發工具,完全免費,甚至還整合了 C#/VB/F# .NET 等 OOP 語言,也提供了無限的擴展功能,耗費資源也小,執行效率也僅比 VS Express 稍慢一些些而已,看來前景還挺看好的。 截至目前為止,SharpDevelop 3.0 beta-2 版本(2008/08/22),是完全相容於 .NET Framework 3.5 環境,但是呢,我利用它的 Form Developer 開發 Windows Form 會出問題,雖然該社群網站似乎有提供說明解決方案,不過,總覺得很不安心,拉一拉表單畫面就要提心吊膽出錯,實在沒道理,所以現在我暫時只用它來開啟已開發好如 NDde 的專案。 很不錯的一點是,SharpDevelop 完全相容 VS Express 的 Solution/Project 格式,完全互通! 總的來說,現在我開發個 C#.NET 應用程式,大概會打開至少一個 VS Express 2008,以及一個 SharpDevelop 的 IDE,系統執行效率也不至於受多大影響。
screenshot_sharpdevelop3b2_with_unit_test

2012年7月12日 星期四

使用 find regex 與 xargs 將特定檔案打包壓縮


通常使用 find . -name "*.txt" 已經很夠用了,但如果要多個附檔名時卻又有點困擾。
這時可以使用 find . -regex 的方式,它是接受正規表示法的。但須留意用法,原先 find . -name "*.txt" 需更新成 find . -regex ".*\.txt",原理部份請參考 regular expression 。
處理多個副檔名的範例:
# find . -regex ".*\.jpg\|.*\.txt"
如果要順便打包壓縮:
# find. -regex ".*\.jpg\|.*\.txt" | xargs tar -rvf test.tgz

2012年7月5日 星期四

JDBC與字元集總結


通過JDBC訪問資料庫時遇到的字元集問題中,可以歸納為如下因素:
- JVM對字元集的處理
JVM核心完全使用Unicode字元集,編碼上採用UTF-16LE(x86和Unix)。 Java編譯器掃描.java原始檔案時將完成預轉換,比如在中文Windows上編譯.java檔時,你可能已經注意到.java檔中的字串和.class中的不一樣。因為.java檔本身用的是gb2312編碼,而.class內則是UTF-16LE編碼。如果你的編輯器支持,你可能會選擇直接用UTF-8來書寫.java來源程式,這時Java編譯器就會用UTF-8對來源程式解碼。
在輸出時,比如調用System.out.print方法也將完成一個編碼轉換,在上述情況中經常是將記憶體中的UTF-16LE編碼的字串轉換成控制台上可讀的gb2312編碼。

- JSP頁面使用的字元集
運行JSP頁面前總會被預處理至.java程式並被編譯成.class,注意到JSP總是一個servlet,因此實際上這裡存在兩個字元集,一是.jsp檔本身使用的字元集,另一則是servlet輸出內容的字元集(content-type)。儘量使.jsp檔本身的字元集和輸出內容的字元集保持一致,比如一致採用UTF-8。Response的實現將jvm中的UTF-16LE字串轉換至<%@page encoding=...%>所指定的編碼,

- Connection 使用的字元集
連接的字元集限制了SQL語句可以使用的字元。這在UTF-16中格外明顯,如果連接不使用UTF-16的字元集,那麼由於大多數的Latin-1字元集對'\0'的處理將使大多數SQL語句成為無效語句,比如SELECT語句通過UTF-16LE編碼後將變成"S\0E\0L\0E\0C\0T\0...",伺服器的SQL分析器在遇到第一個'\0'便認為語句已經結束。

但仍然可以將UTF-16LE編碼的字串送入Latin-1字元集的連接,方法是SQL語句本身仍採用Latin-1編碼,而相關的字串(引號內部的)採用UTF-16LE。這種情況下,UTF-16LE的字串不能包括Unicode字元集中編碼小於256的字元(包括拉丁字母和數位、英文符號),否則SQL分析器會報告"字串未結束"之類的錯誤。(為什麼?)
- 資料庫系統
並不是所有資料庫都支援Unicode,你可能有必要通過字元集轉換來保存一些特殊的字元資料。如果資料庫僅支援Latin-1字元集(這樣的系統不在少數),對於中文的情況,你可以將字串用Latin-1編碼,然後用gb2312解碼,覺得困惑?如果你(曾經)是C++程式師,那麼這裡的編碼類似於dynamic_cast, 而解碼則相當於reinterpret_cast。
sql_str = new String( java_str.getBytes("ISO-8859-1"), "gb2312" );
在獲取資料的時候則剛好相反:
java_str = new String( sql_str.getBytes("gb2312"), "ISO-8859-1" );

如果資料庫系統支援Unicode,那麼請儘量採用Unicode。有些手冊上建議你根據具體情況決定是否使用Unicode,因為Unicode將佔用更多的存儲空間,而且如果採用UTF-8,排序的速度將會"減慢30% (mysql)",請不要為這些詞語而顧慮,大多數情況這些都不是問題。
對於SQL Server 2000,這篇文章值得一讀:
http://www.microsoft.com/china/msdn/library/techart/IntlFeaturesInSQLServer2000.asp
最關鍵的就是你需要在字串左邊加上N字元(N一定要大寫),如
INSERT INTO table(name_en, name_native) VALUES('yokohama', N' 橫? ')

對於Sybase資料庫(Sybase 11.5, Sybase 12),系統不支援UTF-16,但支援UTF-8,為了使用Unicode,你可能需要下面的連接字串:
jdbc:sybase:Tds:127.0.0.1:4000/database?charset=utf8&jconnect_version=0
類似的,在SQL語句中使用字元N修飾的字串,使SQL分析器認為字串是Unicode編碼的。
對於MySQL資料庫,系統支援四個級別的字元集設置:
連接,資料庫,表,欄位
MySQL參考手冊第9章有詳細的討論,但注意版本要求4.1.0以上,同時Windows (nt,2k,xp) 的用戶請注意 4.1.0 有個bug,你必須使用4.1.1才能正確使用Unicode。
在 SQL Server 和 Sybase 中都有N開頭的欄位類型,它們被設計用於國際化的字元存儲。在SQL Server中,比如NTEXT實際上就是用Unicode存儲的的欄位類型。
SQL-99規定了Unicode字串統一使用 u 首碼,如 u"??????",但目前還沒有見哪個資料庫系統支援這種語法。

附:幾個字元集支援的測試例子 (需要測試用的源碼可以向我要:jljljjl@yahoo.com)
聲明:
Connection c;
Statement s;
生成資料:
String lit1 = "的文本:中華人民共和國]";
String[] encs = new String[] {
"(default)",
"ISO-8859-1",
"cp850",
"gb2312",
"gbk",
"big5",
"UTF-16LE",
"UTF-16BE",
"UTF-8",
};

String javaSrc = "[這是預設編碼" + lit1;
byte[] rawdata;

s.executeUpdate("DELETE FROM StringTable");
for (int i = 0; i < encs.length; i++) {
String targetEncoding = encs[i];
javaSrc = "[這是" + targetEncoding + lit1;
String testTarget;

if (i == 0) {
rawdata = javaSrc.getBytes();
testTarget = new String(rawdata);
} else {
rawdata = javaSrc.getBytes(targetEncoding);
testTarget = new String(rawdata);
}

System.out.println(testTarget);

String sql = ("INSERT INTO StringTable(charset,text) VALUES(" +
"'" + targetEncoding + "', N'" + testTarget + "')");
System.out.println(sql);

s.executeUpdate(sql);
}
獲取資料:
ResultSet rs = s.executeQuery("SELECT * FROM StringTable");

String charset;
String text;
while (rs.next()) {
charset = rs.getString("charset").trim();
text = rs.getString("text");

System.out.println(charset + ": [" + text + "]");

byte[] raws = text.getBytes();

String restore;
if ("(default)".equals(charset)) {
restore = new String(raws);
} else {
restore = new String(raws, charset);
}
System.out.println(" --> [" + restore + "]");
}
典型測試結果:
SQL-Server, type = ntext
(default): [[這是(default)的文本:中華人民共和國]]
--> [[這是(default)的文本:中華人民共和國]]
ISO-8859-1: [[??ISO-8859-1???????????]]
--> [[??ISO-8859-1???????????]]
cp850: [[??cp850???????????]]
--> [[??cp850???????????]]
gb2312: [[這是gb2312的文本:中華人民共和國]]
--> [[這是gb2312的文本:中華人民共和國]]
gbk: [[這是gbk的文本:中華人民共和國]]
--> [[這是gbk的文本:中華人民共和國]]
big5: [[?琌big5?????㎝?]]
--> [[?是big5的文本:中?人民共和?]]
UTF-8: [[榪欐槸UTF-8鐨?枃鏈細涓??烘皯鍏卞拰鍥絔]
--> [[這是UTF-8的文本:中華人民共和國]]

SQL-Server, type = text
(default): [[這是(default)的文本:中華人民共和國]]
--> [[這是(default)的文本:中華人民共和國]]
ISO-8859-1: [[??ISO-8859-1???????????]]
--> [[??ISO-8859-1???????????]]
cp850: [[??cp850???????????]]
--> [[??cp850???????????]]
gb2312: [[這是gb2312的文本:中華人民共和國]]
--> [[這是gb2312的文本:中華人民共和國]]
gbk: [[這是gbk的文本:中華人民共和國]]
--> [[這是gbk的文本:中華人民共和國]]
big5: [[?琌big5?????㎝?]]
--> [[?是big5的文本:中?三民囝和?]]
UTF-8: [[榪欐槸UTF-8鐨?枃鏈細涓??烘皯鍏卞拰鍥絔]
--> [[這是UTF-8的文本:中華人民共和國]]
Sybase, type = char
(default): [[??(default)???????????]]
--> [[??(default)???????????]]
ISO-8859-1: [[??ISO-8859-1???????????]]
--> [[??ISO-8859-1???????????]]
cp850: [[??cp850???????????]]
--> [[??cp850???????????]]
gb2312: [[??gb2312???????????]]
--> [[??gb2312???????????]]
gbk: [[??gbk???????????]]
--> [[??gbk???????????]]
big5: [[??big5???????????]]
--> [[??big5???????????]]
UTF-16LE
--> [[?啦???????????乎?民共?]]
UTF-16BE:
--> [[??????????????乎?共???]
UTF-8: [[???UTF-8?????????????????]
--> [[???UTF-8?????????????????]

Sybase, type = nchar
(default): [[??(default)???????????]]
--> [[??(default)???????????]]
ISO-8859-1: [[??ISO-8859-1???????????]]
--> [[??ISO-8859-1???????????]]
cp850: [[??cp850???????????]]
--> [[??cp850???????????]]
gb2312: [[??gb2312???????????]]
--> [[??gb2312???????????]]
gbk: [[??gbk???????????]]
--> [[??gbk???????????]]
big5: [[??big5???????????]]
--> [[??big5???????????]]
UTF-16LE
--> [[?啦???????????乎?民共?]]
UTF-16BE:
--> [[??????????????乎?共???]
UTF-8: [[???UTF-8?????????????????]
--> [[???UTF-8?????????????????]
Sybase, type = char, charset=utf8
(default): [[這是(default)的文本:中華人民共和國]]
--> [[這是(default)的文本