顯示具有 Unicode 標籤的文章。 顯示所有文章
顯示具有 Unicode 標籤的文章。 顯示所有文章

2008年6月13日

Bugfix: ls與format

我已經修正完畢LS函數和FORMAT函數的Bug,下面列出的是FORMAT的定義。至於LS的定義修改方式很簡單,把LENGTH?用LENGTH+?取代即可。當FORMAT遇到中文時,終於不會出問題了!

LENGTH+?不會計算出字串的字元長度,而是會計算出「相當於多少個half-width字元」的長度。記得把前一篇文章的Full-Wide-Width-charset定義也加進來,因為LENGTH+?會用到這個定義。

我會找一天把修正後的結果透過DevBase遞交給REBOL公司。

length+?: func [str [string!] /local ans ] [
ans: 0
foreach ch str [
either find Full-Wide-Width-charset ch [
ans: ans + 2
] [
ans: ans + 1
]
]
]

format: make function! [[
"Format a string according to the format dialect."
rules {A block in the format dialect. E.g. [10 -10 #"-" 4]}
values
/pad p
/local out val
][
p: any [p #" "]
unless block? :rules [rules: reduce [:rules]]
unless block? :values [values: reduce [:values]]
out: make string! ""
foreach rule rules [
if word? :rule [rule: get rule]
switch type?/word :rule [
integer! [
val: first+ values
val: form :val
pad: (abs rule) - length+? val
if negative? pad [ pad: 0 ]
either positive? rule [
append out :val
append/dup out p pad
] [
append/dup out p pad
append out :val
]
]
string! [append out rule]
char! [append out rule]
]
]
if not tail? values [append out values]
head out
]]

Format函數與寬字元

REBOL 3.0有提供一個函數名為format,用來進行輸出文字的格式化。許多函數都會用到format,例如what、ls。

format一遇到中文就會失靈,輸出格式亂掉,這是因為中文字是寬字元(Wide Character)。為了要修正format的此錯誤,我剛剛把Unicode Standard Annex #11 (East Asian Width) 所附的檔案整理過,找出其中屬於Full-Width與Wide的字元。接下來,就等我(或任何人)有空去修正format函數的定義了。
full-wide-width-charset: charset [
#"^(1100)" - #"^(1159)"
#"^(115F)"
#"^(2329)" - #"^(232A)"
#"^(2E80)" - #"^(2E99)"
#"^(2E9B)" - #"^(2EF3)"
#"^(2F00)" - #"^(2FD5)"
#"^(2FF0)" - #"^(2FFB)"
#"^(3000)" - #"^(303E)"
#"^(3041)" - #"^(3096)"
#"^(3099)" - #"^(30FF)"
#"^(3105)" - #"^(312D)"
#"^(3131)" - #"^(318E)"
#"^(3190)" - #"^(31B7)"
#"^(31C0)" - #"^(31E3)"
#"^(31F0)" - #"^(321E)"
#"^(3220)" - #"^(3243)"
#"^(3250)" - #"^(32FE)"
#"^(3300)" - #"^(33FF)"
#"^(3400)" - #"^(4DB5)"
#"^(4E00)" - #"^(9FC3)"
#"^(A000)" - #"^(A48C)"
#"^(A490)" - #"^(A4C6)"
#"^(AC00)" - #"^(D7A3)"
#"^(F900)" - #"^(FA2D)"
#"^(FA30)" - #"^(FA6A)"
#"^(FA70)" - #"^(FAD9)"
#"^(FE10)" - #"^(FE19)"
#"^(FE30)" - #"^(FE52)"
#"^(FE54)" - #"^(FE66)"
#"^(FE68)"
#"^(FF01)" - #"^(FF60)"
#"^(FFE0)" - #"^(FFE6)"
]

2008年4月29日

整合Unicode核心和圖形介面的版本

REBOL 3今天釋出內部版本2.100.8,將圖形次系統加入Unicode核心中。體積從221 KB變成523 KB。目前這個版本尚欠缺一些常用的網路通訊協定,欠缺一些編碼解碼器,圖形介面的部分也尚未支援Unicode文字的展示。詳細的說明,請見http://www.rebol.net/wiki/R3_Releases

2008年4月1日

關於Unicode的一些判斷函數

utf?函數需要一個binary!當參數。根據此binary的BOM(byte order mark)來做判斷,如果傳出值的絕對值是8,則表示UTF-8;如果傳出值的絕對值為16,則表示UTF-16;如果是Big-Endian,則傳出值為正;如果為Little-Endian,則傳出值為負。 例如:

>> utf? #{EF BB BF}
== 8
>> utf? #{FE FF}
== 16
>> utf? #{FF FE}
== -16
>> utf? #{00 00 FE FF}
== 32
>> utf? #{FF FE 00 00}
== -32

如果binary不是上述的開頭,會得到0的傳出值,表示無法識別。

latin1?需要一個引數,可以是泛字串或字元或整數(表示Code Point)。如果code point都小於256,則傳出true;否則傳出false。latin1?未來有可能改成latin-1?。

ascii?函數和latin1?完全一樣,但用來判斷code point是否小於128。

關於Unicode的BOM,可以參考這篇FAQ的解釋以及這篇Wiki。REBOL的UTF?只用來判斷8, 16, 32的LE和BE的BOM,不支援其他BOM(因為其他BOM很少有人用)。

2008年3月30日

REBOL 3.0未來將可以支援UCS-4

REBOL 3.0支援Unicode,內部使用UCS-2(也就是16位元)的方式記錄資料,已經相當夠我們使用。在REBOL 3.0的一切都穩定之後,REBOL公司不排除特別為中文的REBOL使用者編譯一套UCS-4(也就是32位元)的版本(只需要改變一下編譯時的設定即可)。如此一來,蒙古文,藏文,以及相當罕用的中文特殊字,都可以支援。

另外,新版的REBOL提供了原生函數,可以幫助我們判斷字元或字串是否為ASCII(0~127),或者是否為Latin-1(0~255)。

2008年3月15日

String和Binary之間的轉換



REBOL 3.0支援Unicode,字串和字元一律是Unicode。任何來自外部的資料,被視為二元,如果是文字資料,必須被解碼(decode)之後,成為Unicode字串,才能使用。字串必須被編碼(encode)轉成二元之後,被送到外部。

2008年3月9日

REBOL 3.0的Unicode進度


你可能會想知道,REBOL 3.0目前對於Unicode的支援,進度如何了?我繪製這張圖,應該可以一目瞭然。目前Unicode的Encoder和Decoder只有支援UTF-8,這部分還有許多需要補足的地方,但是這應該不會需要太多時間。而View的方面,目前尚未開始支援Unicode,只要我們的REBOL圖學大師Cyphre有空,應該只需要幾天就可以把這部分的程式加上去。所以整體來說,目前REBOL 3.0在Uniocde的支援,已經相當接近竣工的階段。

目前我對於Unicode Alpha版的測試,已經接近尾聲,Carl應該很快就會修正完畢所有的bug,讓REBOL繼續往下一個階段走。

2008年3月6日

用REBOL 3.0列出Unicode字元表

REBOL 3.0 支援Unicode,而且是連console都支援Unicode,你可以在console中輸入或輸出任何Unicode字元,只要你有適當的字型,就不會有問題。

下面是一個簡短的範例,將0x0000-0xFFFF的全部Unicode列出,程式很簡單,所以我就不說明了:

for i 0 4095 1 [ 
prin rejoin [ newline to-hex/size i 3 "0 " ]
for j 0 15 1 [
prin [ to-char to-hex/size i * 16 + j 4 " " ]
]
wait .01
]

2008年3月5日

REBOL/core Unicode新版本釋出

幾個小時前,Carl釋出新版的Unicode核心(release 5)給內部測試小組。我換算一下時間,相當於當地凌晨三點 ... 他也太拼命了吧,寫程式寫到凌晨三點!

這個版本修正了一些重大的錯誤,我這兩天有空就會開始測試!