天天看點

PostgreSQL Oracle 相容性之 - COMPOSE , UNISTR , DECOMPOSE

參考

<a href="http://www.th7.cn/db/oracle/2011-06-30/8490.shtml">http://www.th7.cn/db/oracle/2011-06-30/8490.shtml</a>

很多語言,包括英語在内,都使用沉音字元(accented character)。

因為這些字元不屬于 ascii 字元集,是以假如不檢視 unicode 值也不使用 unicode 編輯器并将其轉成一個已知字元集,就很難編寫使用這些字元的代碼。

oracle9i 引入了 compose 函數,該函數接受一串 unicode 字元并規則化其文本。

這就意味着它可以接受一個字母和一個組合标記,比如說‘a'(unicode 字元0097)和沉音符(unicode 字元0300),然後建立一個單獨的由兩個标記組合而成的字元。

compose 使用非凡的組合标記,而沒有使用 ascii 中相應的音節标記,它所使用的非凡的組合标記是 unicode 标準 的一部分。上面的例子的結果應該是 unicode 字元00e0(有一個沉音符的小寫拉丁字母‘a')。

在 ansi 中最常見的組合字元有: u+0300:沉音符(grave accent)( ` )。 u+0301:重音符(acute accent)( ' )。 u+0302:抑揚音符号(circumflex accent)(^)。 u+0303:颚化符号(tilde)(~)。 u+0308:元音變音 ?。

假如沒有非凡的軟體或者鍵盤驅動程式的話,很難在鍵盤上輸入 unicode 字元0097和0300。是以,以純 ascii 文本輸入 unicode 序列的一個方法是使用 unistr 函數。

這個函數接受一個 ascii 字元串然後以國家字元集(通常作為16位 unicode 或者 utf-8 字元集安裝)建立一個 unicode 字元的序列。

它使用十六進制占位符序列映射任何非 ascii 字元,映射方式與 java 類似。

要輸入a後接一個沉音符組合字元的序列,可以使用 unistr(‘a300'),而不要試圖直接在代碼中輸入字元。

這個函數在任何字元集以及任何具有基于 unicode 的國家字元集的資料庫下都可以正常運作。

可以将多個組合字元放在函數中――可以在 unistr 函數中混合使用 ascii 和 unicode 占位符。

例如,可以像下面這樣使用 unistr 函數:

在将 unistr 函數的輸出與 compose 組合時,可以在不查找任何值的情況下生成一個 unicode 字元。

例如:

unistr用法

輸入編碼得到unicode編碼的字元

<a href="http://docs.oracle.com/cd/b19306_01/server.102/b14200/functions204.htm">http://docs.oracle.com/cd/b19306_01/server.102/b14200/functions204.htm</a>

unistr(string)

compose用法

将兩個unicode編碼的字元合成,例如字母與沉音符合成為另一個unicode字元

<a href="http://docs.oracle.com/cd/b19306_01/server.102/b14200/functions025.htm">http://docs.oracle.com/cd/b19306_01/server.102/b14200/functions025.htm</a>

compose(char)

decompose用法

将帶有合成字元的字元串,解析成合成前的unicode字元串

<a href="http://docs.oracle.com/cd/b19306_01/server.102/b14200/functions041.htm">http://docs.oracle.com/cd/b19306_01/server.102/b14200/functions041.htm</a>

decompose(string)

自定義映射關系

需要使用者自定義合成字母與字母,unicode沉音符的映射關系, 進行編碼後存在表或者代碼中。

自定義函數

基于對應關系的編碼,合成,或解碼字元串。

<a href="http://unicode-table.com/cn">http://unicode-table.com/cn</a>

<a href="http://info.flagcounter.com/h9v1">count</a>