- Jul 12 Mon 2010 15:46
-
DELPHI寫入EXCEL時,寫入速度緩慢問題
最近在修改使用者提出 EXCEL 報表欄位,發現有幾支 procedure 轉出 EXCEL 的速度非常龜,而這幾支 procedure 是前輩所留下的產物,跟自己最近寫的轉 EXCEL 報表速度上差很多,以為是卡在SQL查詢,如果查詢條件KEY值給不齊全,有可能因為資料過多,查詢變很慢,但是測試後應該不是SQL查詢的問題,再對照前輩與自己的程式,感覺不出差異,最後看到 DELPHI 內設定EXCEL時前面通常會有一些基本設定,發現了這幾支程式都有設定列印範圍,姑且註解掉試試看,果然...............兇手就是它! PageSetup.PrintArea := 'A:R'; //設定列印範圍 建議把它移到資料轉完後,最後在給上這個參數就好了。
- Jul 06 Tue 2010 17:13
-
"伺服器存放空間不足,無法處理此指令"解決辦法
今天本機遇到這問題,使用第一種方式解決了這個問題。 http://ithelp.ithome.com.tw/question/10002336 =============================================== 第一種方法:
一般而言,此問題可能與防毒軟體更改了系統的登錄值而導致。
請依下列步驟找到目前的 IRPStackSize 後更改為建議值 25.
a. 按一下 [開始],按一下 [執行]。
b. 輸入:regedit,然後按一下 [確定]。
c. 找到下列機碼:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Parameters
d. 在右邊的視窗, 雙擊 IRPStackSize 的值。
提示: 如果 IRPStackSize 並不存在,請依下列方式建立:
(1). 在 Parameters 資料夾上按右鍵。
(2). 指向新增, 並選取 DWord 值。
(3). 輸入 IRPStackSize
重要: 請注意大小寫。
e. 更改底數為十進制。
f. 在值的資料欄輸入25然後按確定。
g. 結束登錄編輯程式。
更改完登錄機碼後, 您必須重新啟動電腦,或重新啟動"伺服器服務" 。
可以透過下列方式:
a. 按一下 [開始],按一下 [執行],輸入:cmd,然後按一下 [確定]。
b. 輸入 net stop server
c. 當服務停止後, 再輸入 net start server 重新啟動該服務.
當執行完後,相關的登錄值即會更新,重開機後您可以觀察問題是否解決。
參考來源:
http://qa.pcuser.com.tw/modules/newbb/viewtopic.php?topic_id=26377&forum=9
=====================================
第二種方法:
事件檢視器內有以下內容
-----------------------------------------------------------------------
事件來源:
Srv
事件識別碼:
2020
描述:
伺服器無法透過系統分頁共用區來進行配置,因為共用區目前是空的。
Meaning The server was unable to allocate from the system paged pool because the pool was empty.
-----------------------------------------------------------------------
相關處理連結
http://support.microsoft.com/default.aspx?scid=kb;en-us;312362
Server is unable to allocate memory from the system paged pool
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Memory Management
1. 新增PoolUsageMaximum, 格式為DWORD, 內容使用十進位, 填入60
Value name: PoolUsageMaximum
Data type: REG_DWORD
Radix: Decimal
Value data: 60
2. 修改PagedPoolSize, 使用十六進位, 填入8個F
Value name: PagedPoolSize
Data type: REG_DWORD
Radix: Hex
Value data: 0xFFFFFFFF
http://support.microsoft.com/default.aspx?scid=kb;en-us;286060
因為其他電腦的分享印表機, 在本機電腦又分享出去造成的問題
參考來源:
http://www.ithome.com.tw/plog/index.php?op=ViewArticle&articleId=11294&blogId=411
一般而言,此問題可能與防毒軟體更改了系統的登錄值而導致。
請依下列步驟找到目前的 IRPStackSize 後更改為建議值 25.
a. 按一下 [開始],按一下 [執行]。
b. 輸入:regedit,然後按一下 [確定]。
c. 找到下列機碼:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Parameters
d. 在右邊的視窗, 雙擊 IRPStackSize 的值。
提示: 如果 IRPStackSize 並不存在,請依下列方式建立:
(1). 在 Parameters 資料夾上按右鍵。
(2). 指向新增, 並選取 DWord 值。
(3). 輸入 IRPStackSize
重要: 請注意大小寫。
e. 更改底數為十進制。
f. 在值的資料欄輸入25然後按確定。
g. 結束登錄編輯程式。
更改完登錄機碼後, 您必須重新啟動電腦,或重新啟動"伺服器服務" 。
可以透過下列方式:
a. 按一下 [開始],按一下 [執行],輸入:cmd,然後按一下 [確定]。
b. 輸入 net stop server
c. 當服務停止後, 再輸入 net start server 重新啟動該服務.
當執行完後,相關的登錄值即會更新,重開機後您可以觀察問題是否解決。
參考來源:
http://qa.pcuser.com.tw/modules/newbb/viewtopic.php?topic_id=26377&forum=9
=====================================
第二種方法:
事件檢視器內有以下內容
-----------------------------------------------------------------------
事件來源:
Srv
事件識別碼:
2020
描述:
伺服器無法透過系統分頁共用區來進行配置,因為共用區目前是空的。
Meaning The server was unable to allocate from the system paged pool because the pool was empty.
-----------------------------------------------------------------------
相關處理連結
http://support.microsoft.com/default.aspx?scid=kb;en-us;312362
Server is unable to allocate memory from the system paged pool
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Memory Management
1. 新增PoolUsageMaximum, 格式為DWORD, 內容使用十進位, 填入60
Value name: PoolUsageMaximum
Data type: REG_DWORD
Radix: Decimal
Value data: 60
2. 修改PagedPoolSize, 使用十六進位, 填入8個F
Value name: PagedPoolSize
Data type: REG_DWORD
Radix: Hex
Value data: 0xFFFFFFFF
http://support.microsoft.com/default.aspx?scid=kb;en-us;286060
因為其他電腦的分享印表機, 在本機電腦又分享出去造成的問題
參考來源:
http://www.ithome.com.tw/plog/index.php?op=ViewArticle&articleId=11294&blogId=411
- Jul 06 Tue 2010 16:13
-
HP ProCurve 1810G-24 GIGA SWITCH傳輸測試
- Jul 06 Tue 2010 16:07
-
HP ProCurve 1810G-24 GIGA SWITCH簡易設定
1. 出廠預設值: 192.168.2.10/24 密碼:空白 2. 將PC與SWITCH接上網路線,並設定PC 的 IP至同網段,即可透過IE連線至192.168.2.10,並將IP設定為規劃好的IP。 10.10.10.249/24
3. 設定密碼
4. 設定時間
5. 更新韌體 HP有雙韌體功能,可在兩個韌體之間切換由哪個韌體開機。 上官網抓對應的韌體回本機。 http://www.procurve.com/customercare/support/software/switches.htm 解壓縮後,使用HTTP模式更新韌體。
解壓縮後, 使用HTTP模式更新韌體 瀏覽選 *.stk code方式更新 更新到備份韌體,也可選備份到作用(Active)韌體
查看韌體:
目前作用中的韌體 是 image1 ,而image2的韌體版本 P.1.14
目前作用中的韌體 是 image1 ,而image1的韌體版本 P.1.17
要使用哪種韌體開機,這邊選擇後,重新開機即可。 6. 重新開機
7. 建立VLAN VLAN ID1 U是作用群組的,所以1~20,24 port是屬於VLAN ID 1群組。
VLAN ID 2 U是作用群組的,所以21~23 port是屬於VLAN ID 2群組。
8. 設定VLAN ID 或 PORT是否有管理權限
這邊VLAN ID 1有權限連入WEB管理。PING的到WEB,還可另外設定單P指定PORT可以管理,但是這個PORT將會變成是Exclude的PORT,可連線到任何PORT不受VLAN限制。
目前設定VLAN ID 1為管理介面,DMZ 的 VLAN ID 2則不能管理此台機器。 因為沒有要跟別SWITCH台串起來做VLAN的區分,故沒以設定Trucks. 9. 開啟 Jumbo Frames功能,可加速GIGA傳輸速度。
Jumbo Frames 解釋: Ethernet的集線器和網卡的功能之一,把Ethernet的數據傳送接收單位(框架)的尺寸變大,從而高效率地進行通訊的功能。 Ethernet把數據分割為一定大小的框架(frame)的單位來進行傳送接收,但在規格上框架的尺寸被定為1,518字節。由於這是通信速度為10Mbps時的樣式,在最近的100Mbps和1Gbps的規格中,相對與通信速率,框架太小導致通訊效率低下。出於這個緣故,最近的通訊機器作為擴張方式裝載了大容量框架來進行傳送接收。框架的尺寸根據機器各種各樣,大部分對應9,000~16,000字節左右。jumbo frame對應所有的通訊機器,在攙雜非對應的機器時採用標準的框架尺寸進行通訊。
3. 設定密碼
4. 設定時間
5. 更新韌體 HP有雙韌體功能,可在兩個韌體之間切換由哪個韌體開機。 上官網抓對應的韌體回本機。 http://www.procurve.com/customercare/support/software/switches.htm 解壓縮後,使用HTTP模式更新韌體。
解壓縮後, 使用HTTP模式更新韌體 瀏覽選 *.stk code方式更新 更新到備份韌體,也可選備份到作用(Active)韌體
查看韌體:
目前作用中的韌體 是 image1 ,而image2的韌體版本 P.1.14
目前作用中的韌體 是 image1 ,而image1的韌體版本 P.1.17
要使用哪種韌體開機,這邊選擇後,重新開機即可。 6. 重新開機
7. 建立VLAN VLAN ID1 U是作用群組的,所以1~20,24 port是屬於VLAN ID 1群組。
VLAN ID 2 U是作用群組的,所以21~23 port是屬於VLAN ID 2群組。
8. 設定VLAN ID 或 PORT是否有管理權限
這邊VLAN ID 1有權限連入WEB管理。PING的到WEB,還可另外設定單P指定PORT可以管理,但是這個PORT將會變成是Exclude的PORT,可連線到任何PORT不受VLAN限制。
目前設定VLAN ID 1為管理介面,DMZ 的 VLAN ID 2則不能管理此台機器。 因為沒有要跟別SWITCH台串起來做VLAN的區分,故沒以設定Trucks. 9. 開啟 Jumbo Frames功能,可加速GIGA傳輸速度。
Jumbo Frames 解釋: Ethernet的集線器和網卡的功能之一,把Ethernet的數據傳送接收單位(框架)的尺寸變大,從而高效率地進行通訊的功能。 Ethernet把數據分割為一定大小的框架(frame)的單位來進行傳送接收,但在規格上框架的尺寸被定為1,518字節。由於這是通信速度為10Mbps時的樣式,在最近的100Mbps和1Gbps的規格中,相對與通信速率,框架太小導致通訊效率低下。出於這個緣故,最近的通訊機器作為擴張方式裝載了大容量框架來進行傳送接收。框架的尺寸根據機器各種各樣,大部分對應9,000~16,000字節左右。jumbo frame對應所有的通訊機器,在攙雜非對應的機器時採用標準的框架尺寸進行通訊。
- Jul 06 Tue 2010 15:50
-
HP ProCurve 1810G-24 GIGA SWITCH開箱
- Jul 06 Tue 2010 14:51
-
好文章分享
我想現在的社會,未來的主人翁就是缺少這樣的教育,正面的教育,而不是寵。 當父母的人也可以思考一下,用什麼方式教育孩子,打罵也好,但要教到小孩變成不作姦犯科的好孩子為止,那怕一千遍、一萬遍的叮嚀。 ================================ 我有一個好父親 邰智源 台灣的「模仿天王」邰智源演出任何知名人物都唯妙唯肖,加上說、學、逗、唱、主持無一不精的本事。問他表演是一種天分,還是後天努力的結果? 他笑說:「都不是,是我的父親給我的教育太好了,讓我很早就懂得『從心所欲,不逾矩』的道理。」 小時候,我算是一個很有家教的小孩,碰上長輩一定會說:「李伯伯好」、「謝叔叔好」…這些都要歸功於我父親的教育方式。 他教孩子從來都是私底下好好說、殷殷勸,從來不在外面打給人家看。 比方說,小時候我很頑皮,老是在院子裏拿竹掃帚追人打,父親就說:「智源,我們出去散步一下。」 走到外面,確定四下無人,父親才說:「智源,跟你商量一件事,剛才那件事……」他和顏悅色,沒有半點責備的意思。 我愛問東問西,想說什麼,就說什麼,父親也都讓我自由表達。 比方說,我覺得父親人長得帥,簡直像劉德華;我的母親人長得胖胖的,實在只能用「可愛」來形容,心理就嘀咕:奇怪,我怎麼沒遺傳到父親的優點呢? 有一天,我指了指母親抱怨說:「爸,你長得這麼帥,我怎麼跟媽一模一樣『難看』呢?」父親聽了直笑,母親有點氣,說:「你這孩子,像我有哪裏不好?」我想,也對! 我的母親人雖然不美,但她念北一女時家裏窮,輟學養家多年,後來靠自己念完高中、空中大學,又念了日本近畿大學法政學系函授班,她是個法學士耶! 童年的幸福,真的一輩子都忘不了,家裏除了父母,還有可愛的老奶奶、叔公、叔叔、奶奶逃難時撿到的孩子,每個人都很疼我。父親要養一家人,還讓我念私立薇閣小學。 那兒校風好,學生上課都背四書五經,老師會設計很多玩樂、尋寶遊戲,寓教於「樂」,所以我每天一早6點就起床背書、看書,拿了好幾次第一名。 到了叛逆期,父親最常提醒我的一句話就是:「不要把我當爸爸,把我當成你的朋友,什麼都可以跟我商量。」 上了國中,果然問題多了,那兒有不少「歪瓜劣棗」,一開始我經常被欺負,功課越來越壞,開始學會抽菸、打架、賭博。 我還記得,我偷了父親一根雪茄,躲在房間內吸,聽見母親上樓敲門,馬上把雪茄藏到床底下,母親聞到了菸味,追問我,我硬是說:「沒有。」 她生氣了,撂了句:「等一下跟你爸講。」小孩抽菸在家可是大忌。到了晚上,我聽見父親的腳步聲,母親向他告狀。 他打開我的房門,看我躲在床上矇頭,把我搖起來,擠擠眼,示意不要出聲,轉頭大喊:「我、在、教、訓、他、哪!」然後就小聲說:「好好睡覺了。」 他坐在床邊,看我睡了,才靜靜地走開。事後,他才找一個私下相處的機會,嚴肅地說:「以後不可以這樣子哦!」 當時我沒戒,一直抽到27歲,後來看了我師父蓮生活佛的書,才知道吸菸的廢氣會堵住七重脈輪,妨害修行,二話不說就扔了菸。 父子同心,父親那年67歲,也戒了菸。更有趣的是,可愛的老奶奶抽到快90歲,同年也把菸戒了。 上國中的時候,我的確變壞了。當時的我愛玩、不念書,看到親戚念海軍學校,一個月可以領2萬2千元(新台幣,下同),心想:當「學生」也可以領錢?太棒了, 就報考了軍校。沒想到,有一年我碰上學長整學弟的歪風。他們知道我吸菸,放話要教訓我,一個相識的學長想解決這件事,我們在談判時,他出手打了我,我就抽出刀子抵抗,刺中了他的大腿,事情於是鬧開了。 出了事,校方打算以「暴行犯上」把我送交軍法審判,我被關禁閉長達1個月。 父親來探監﹏隔門上的小洞抓我的手,說:「你放心,我一定救你出來,男孩子不可以哭。」我「嗯」么一聲,其實,我後悔、害怕極了。 幸好校長饒了我,讓我開除走人,總算逃過坐牢的惡果,但父親卻必須幫我賠上17萬5千元。 犯了這麼大的過錯,父親還是沒責備我,只說:「我們好好考慮一下,以後你想做什麼? 要不要乾脆介紹你去中央印製廠當電腦排版工人,一個月4萬元也不錯喔。」 我想了一下,小聲告訴父親,我想念書,父親便拿出錢來,讓我去補習班補了1年。 那次的轉變,讓我回到童年時代作個「讀書人」的快樂。 隔年,我考上國立藝專,之後當完兵,參加了製作人王偉忠的《青春大對抗》錄影,緊接演了《連環泡》、電視劇《包青天》(獲金鐘獎最佳男配角獎)、《施公奇案》、 《啞巴與新娘》等,接接演八大電視台的《主席有約》、中天電視台的《全民亂講》、《全民大悶鍋》(獲金鐘獎最佳綜藝節目獎)和《全民最大黨》,如此一路走紅到現在。 我感謝我的父親,他老人家一輩子以為我榮,不管我好也罷、壞也罷。我結了婚,生了兒子,現在同樣也為人父,卻少了他的耐心。 有一次,我的兒子見了我父親不肯問候,我氣得打了他一下,父親和小時候一樣,把我拉到一旁,問我:「智源,我們商量一下,你為什麼打兒子?」 我說:「他沒禮貌!」父親嘿、嘿笑了兩聲,說了一句:「是你兒子對我沒禮貌多,還是你對我沒有禮貌比較多?」我一時尷尬得不知如何回答。 父親很嚴肅地告訴我:「小孩子不乖,你要好好教他,教不聽,再教一次;教不聽,再教一次;有一天,他一定會知道的。現在你打了他,是你不耐煩,不是他不懂。 他遲早會懂的。」唉!我的父親真是讓我汗顏。我不就是他口裏說的,教了一百遍、一千遍,永遠的「好孩子」嗎? 父親前2年過世。我永遠不會忘記他臨終前拉我的手說:「很感謝你為我做的一切。」 當時,我怔住了,整顆心揪在一起,我想不起來我為我的父親做了什麼,只記得當年在考慮要念書還是要當工人時,他認真告訴我的一番話,他說: 「你只要不作奸犯科就好,做什麼都無所謂。」我不敢說自己工作做得多好、讓父親多有面子,但我肯定自己有一個好父親;未來的日子,也會努力做一個好父親。
- Jul 03 Sat 2010 02:15
-
世界盃足球賽事,忽然想要巴拉圭贏球
原因………看到下面的新聞。 ======================================= 激勵巴拉圭 勝利女神放話裸奔
更新日期:
更新日期:2010/07/02 04:11〔記者倪婉君/綜合報導〕一邊是波濤洶湧的24歲巴拉圭內衣名模拉莉莎,一邊是矮小臃腫的49歲阿根廷教頭馬拉度納,如果他們都要裸奔,你要看哪一邊? 相信男性球迷的答案已呼之欲出,那就幫巴拉圭加油吧!因為巴拉圭「勝利女神」拉莉莎已經放話:「如果巴拉圭拿到世界盃冠軍,我就在街上裸奔,身上只有巴拉圭國旗顏色(紅、白、藍)的身體彩繪。」 拉莉莎是連日本媒體都畏懼的「勝利女神」,因為至今只要有她在場邊加油,巴拉圭還沒輸過。從預賽到現在,巴拉圭是2勝2和戰績,在淘汰日本的關鍵16強戰中,巴國更在PK大戰氣走日本,日本媒體特別專訪拉莉莎,她還說:「日本球員太矮小了。」 只是巴拉圭的8強隊手是「無敵艦隊」西班牙,巴國要出線的機率實在不高。但若真能奇蹟晉級,巴拉圭就有機會和阿根廷在4強戰交手,屆時就是兩位裸奔主角的另類大對決。 因為馬拉度納是在拉莉莎之前,第一位放話裸奔的人,在廣播節目說過:「只要阿根廷奪冠,我就在布宜諾斯艾利斯(阿國首都)市中心裸奔。」 但Huffington Post網站夠絕,文末配上9張拉莉莎在場邊加油的性感連環圖,再反問讀者:「你現在支持巴拉圭了嗎?」
- Jul 01 Thu 2010 14:10
-
你的硬碟健康嗎?
目前的硬碟本身都支援 S.M.A.R.T 監控訊息,可以提硬碟相關的訊息,但是要如何得知這些訊息呢?就要靠軟體啦,下面介紹大家一套軟體,可提前發現硬碟是否健康,是否該把幾年努力下載的 A片 重要資料給好好備份,等硬碟壽命榨乾後,資料才不會消失。 ※ CrystalDiskInfo 官網 下載頁面
§ CrystalDiskInfo 最新版 EXE 安裝檔 [x86, Windows 7/2008/Vista/2003/XP/2000, 多國語言]
§ CrystalDiskInfo 最新版 ZIP 壓縮檔 [x86, Windows 7/2008/Vista/2003/XP/2000, 多國語言] http://blog.yam.com/dllee/article/21403172
§ CrystalDiskInfo 最新版 EXE 安裝檔 [x86, Windows 7/2008/Vista/2003/XP/2000, 多國語言]
§ CrystalDiskInfo 最新版 ZIP 壓縮檔 [x86, Windows 7/2008/Vista/2003/XP/2000, 多國語言] http://blog.yam.com/dllee/article/21403172
- Jul 01 Thu 2010 09:03
-
機器人世足賽-模擬假摔還真像
最近世足賽已經進入八強階段,今年的冷門也算不少,亞洲國家很可惜的無緣進入八強,但是以先天條件如身高、體能等來說,也算表現的不錯了! 沒想到機器人界,也辦了一場足球友宜賽,參加隊伍有兩隊,所以不是第一就是第二,而且都是德國贏!? 假摔技倆都用的不錯,還有守門員劈腿……………這個厲害…………… http://chinese.engadget.com/2010/06/30/robocup-soccer-2010-finals-show-impressive-realism-by-feigning-i/
- Jun 30 Wed 2010 12:01
-
DELPHI 7 下將文字存成UTF8格式
上網找到下面的程式碼,修了一下測試,真的可以耶!!!!最近的程式剛好有UTF8編碼的困擾,使用這方式轉是方便多了,不過還要測試會不會有問題。 討論區:http://delphi.ktop.com.tw/board.php?cid=30&fid=76&tid=89562 procedure TForm1.Button1Click(Sender: TObject);
var
S:UTF8String;
F:TextFile;
TntEdit1: TStringList;
begin
TntEdit1 := TStringList.Create;
TntEdit1.Add('我是天才我是天才我是天才');
S:=UTF8Encode(TntEdit1.Text);
AssignFile(F, 'C:\test.txt');
Rewrite(F);
Write(F,#$EF+#$BB+#$BF); //UTF8??
Write(F,S);
CloseFile(F);
end; 結果去開C:\test.txt 來看,真的直接就是UTF8編碼,在XP下看中文也正常,沒有亂碼。
Write(F,#$EF+#$BB+#$BF); 中 #$EF+#$BB+#$BF 的意義 ======================================================================= http://60.248.128.85/bbs/dv_rss.asp?s=xhtml&boardid=63&id=491&page=3 這是一篇程式員寫給程式員的趣味讀物。所謂趣味是指可以比較輕鬆地瞭解一些原來不清楚的概念,增進知識,類似於打RPG遊戲的升級。整理這篇文章的動機是兩個問題: 問題一: 問題二: 最近在網上看到一個ConvertUTF.c,達到了UTF-32、UTF-16和UTF-8這三種編碼方式的相互轉換。對於Unicode(UCS2)、GBK、UTF-8這些編碼方式,我原來就瞭解。但這個程式讓我有些糊塗,想不起來UTF-16和UCS2有什麼關係。 查了查相關資料,總算將這些問題弄清楚了,順帶也瞭解了一些Unicode的細節。寫成一篇文章,送給有過類似疑問的朋友。本文在寫作時盡量做到通俗易懂,但要求讀者知道什麼是字元,什麼是十六進制。 0、big endian和little endian big endian和little endian是CPU處理多字元數的不同方式。例如「漢」字的Unicode編碼是6C49。那麼寫到文件裡時,究竟是將6C寫在前面,還是將49寫在前面?如果將6C寫在前面,就是big endian。還是將49寫在前面,就是little endian。 「endian」這個詞出自《格列佛遊記》。小人國的內戰就源於吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開,由此曾發生過六次叛亂,其中一個皇帝送了命,另一個丟了王位。 我們一般將endian翻譯成「字元序」,將big endian和little endian稱作「大尾」和「小尾」。 1、字元編碼、內碼,順帶介紹中文字編碼 字元必須編碼後才能被電腦處理。電腦使用的缺省編碼方式就是電腦的內碼。早期的電腦使用7位的ASCII編碼,為了處理中文字,程式員設計了用於簡體中文的big5和用於繁體中文的big5。 big5(1980年)一共收錄了7445個字元,包括6763個中文字和682個其它符號。中文字區的內碼範圍高字元從B0-F7,低字元從A1-FE,佔用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。 big5支援的中文字太少。1995年的中文字擴展規範GBK1.0收錄了21886個符號,它分為中文字區和圖形符號區。中文字區包括21003個字元。2000年的GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個中文字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。現在的PC平台必須支援GB18030,對嵌入式產品暫不作要求。所以手機、MP3一般只支援big5。 從ASCII、big5、GBK到GB18030,這些編碼方法是向下兼容的,即同一個字元在這些方案中總是有相同的編碼,後面的標準支援更多的字元。在這些編碼中,英文和中文可以統一地處理。區分中文編碼的方法是高字元的最高位不為0。按照程式員的稱呼,big5、GBK到GB18030都屬於雙字元字元集 (DBCS)。 有的中文Windows的缺省內碼還是GBK,可以透過GB18030升級包升級到GB18030。不過GB18030相對GBK增加的字元,普通人是很難用到的,通常我們還是用GBK指代中文Windows內碼。 這裡還有一些細節: 2、Unicode、UCS和UTF 前面提到從ASCII、big5、GBK到GB18030的編碼方法是向下兼容的。而Unicode只與ASCII兼容(更準確地說,是與ISO-8859-1兼容),與GB碼不兼容。例如「漢」字的Unicode編碼是6C49,而GB碼是BABA。 Unicode也是一種字元編碼方法,不過它是由國際組織設計,可以容納全世界所有語言文字的編碼方案。Unicode的學名是"Universal Multiple-Octet Coded Character Set",簡稱為UCS。UCS可以看作是"Unicode Character Set"的縮寫。 根據維基百科全書(http://zh.wikipedia.org/wiki/)的記載:歷史上存在兩個試圖獨立設計Unicode的組織,即國際標準化組織(ISO)和一個軟體製造商的協會(unicode.org)。ISO開發了ISO 10646項目,Unicode協會開發了Unicode項目。 在1991年前後,雙方都認識到世界不需要兩個不兼容的字元集。於是它們開始合併雙方的工作成果,並為創立一個單一編碼表而協同工作。從Unicode2.0開始,Unicode項目採用了與ISO 10646-1相同的字庫和字碼。 目前兩個項目仍都存在,並獨立地公佈各自的標準。Unicode協會現在的最新版本是2005年的Unicode 4.1.0。ISO的最新標準是10646-3:2003。 UCS規定了怎麼用多個字元表示各種文字。怎樣傳輸這些編碼,是由UTF(UCS Transformation Format)規範規定的,常見的UTF規範包括UTF-8、UTF-7、UTF-16。 IETF的RFC2781和RFC3629以RFC的一貫風格,清晰、明快又不失嚴謹地描述了UTF-16和UTF-8的編碼方法。我總是記不得IETF是Internet Engineering Task Force的縮寫。但IETF負責維護的RFC是Internet上一切規範的基礎。 3、UCS-2、UCS-4、BMP UCS有兩種格式:UCS-2和UCS-4。顧名思義,UCS-2就是用兩個字元編碼,UCS-4就是用4個字元(實際上只用了31位,最高位必須為0)編碼。下面讓我們做一些簡單的數學遊戲: UCS-2有2^16=65536個碼位,UCS-4有2^31=2147483648個碼位。 UCS-4根據最高位為0的最高字元分成2^7=128個group。每個group再根據次高字元分為256個plane。每個plane根據第3個字元分為256行 (rows),每行包含256個cells。當然同一行的cells只是最後一個字元不同,其餘都相同。 group 0的plane 0被稱作Basic Multilingual Plane, 即BMP。或者說UCS-4中,高兩個字元為0的碼位被稱作BMP。 將UCS-4的BMP去掉前面的兩個零字元就得到了UCS-2。在UCS-2的兩個字元前加上兩個零字元,就得到了UCS-4的BMP。而目前的UCS-4規範中尚未任何字元被分配在BMP之外。 4、UTF編碼 UTF-8就是以8位為單元對UCS進行編碼。從UCS-2到UTF-8的編碼方式如下: UCS-2編碼(16進制)
UTF-8 字元流(二進制) 0000 - 007F
0xxxxxxx 0080 - 07FF
110xxxxx 10xxxxxx 0800 - FFFF
1110xxxx 10xxxxxx 10xxxxxx 例如「漢」字的Unicode編碼是6C49。6C49在0800-FFFF之間,所以肯定要用3字元模板了:1110xxxx 10xxxxxx 10xxxxxx。將6C49寫成二進制是:0110 110001 001001, 用這個比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。 讀者可以用記事本測試一下我們的編碼是否正確。 UTF-16以16位為單元對UCS進行編碼。對於小於0x10000的UCS碼,UTF-16編碼就等於UCS碼對應的16位無符號整數。對於不小於0x10000的UCS碼,定義了一個算法。不過由於實際使用的UCS2,或者UCS4的BMP必然小於0x10000,所以就目前而言,可以認為UTF-16和UCS-2基本相同。但UCS-2只是一個編碼方案,UTF-16卻要用於實際的傳輸,所以就不得不考慮字元序的問題。 5、UTF的字元序和BOM UTF-8以字元為編碼單元,沒有字元序的問題。UTF-16以兩個字元為編碼單元,在解釋一個UTF-16文本前,首先要弄清楚每個編碼單元的字元序。例如收到一個「奎」的Unicode編碼是594E,「乙」的Unicode編碼是4E59。如果我們收到UTF-16字元流「594E」,那麼這是「奎」還是「乙」? Unicode規範中推薦的標記字元順序的方法是BOM。BOM不是「Bill Of Material」的BOM表,而是Byte Order Mark。BOM是一個有點小聰明的想法: 在UCS編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字元,它的編碼是FEFF。而FFFE在UCS中是不存在的字元,所以不應該出現在實際傳輸中。UCS規範建議我們在傳輸字元流前,先傳輸字元"ZERO WIDTH NO-BREAK SPACE"。 這樣如果接收者收到FEFF,就表明這個字元流是Big-Endian的;如果收到FFFE,就表明這個字元流是Little-Endian的。因此字元"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。 UTF-8不需要BOM來表明字元順序,但可以用BOM來表明編碼方式。字元"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF(讀者可以用我們前面介紹的編碼方法驗證一下)。所以如果接收者收到以EF BB BF開頭的字元流,就知道這是UTF-8編碼了。 Windows就是使用BOM來標記文本文件的編碼方式的。 6、進一步的參考資料 本文主要參考的資料是 "Short overview of ISO-IEC 10646 and Unicode" (http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)。 我還找了兩篇看上去不錯的資料,不過因為我開始的疑問都發現了答案,所以就沒有看:"Understanding Unicode A general introduction to the Unicode Standard" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a) "Character set encoding basics Understanding character set encodings and legacy encodings" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03) 我寫過UTF-8、UCS-2、GBK相互轉換的軟體包,包括使用Windows API和不使用Windows API的版本。以後有時間的話,我會整理一下放到我的個人首頁上(http://fmddlmyy.home4u.china.com)。 我是想清楚所有問題後才開始寫這篇文章的,原以為一會兒就能寫好。沒想到考慮措辭和查證細節花費了很長時間,竟然從下午1:30寫到9:00。希望有讀者能從中受益。 =======================================================================
var
S:UTF8String;
F:TextFile;
TntEdit1: TStringList;
begin
TntEdit1 := TStringList.Create;
TntEdit1.Add('我是天才我是天才我是天才');
S:=UTF8Encode(TntEdit1.Text);
AssignFile(F, 'C:\test.txt');
Rewrite(F);
Write(F,#$EF+#$BB+#$BF); //UTF8??
Write(F,S);
CloseFile(F);
end; 結果去開C:\test.txt 來看,真的直接就是UTF8編碼,在XP下看中文也正常,沒有亂碼。
Write(F,#$EF+#$BB+#$BF); 中 #$EF+#$BB+#$BF 的意義 ======================================================================= http://60.248.128.85/bbs/dv_rss.asp?s=xhtml&boardid=63&id=491&page=3 這是一篇程式員寫給程式員的趣味讀物。所謂趣味是指可以比較輕鬆地瞭解一些原來不清楚的概念,增進知識,類似於打RPG遊戲的升級。整理這篇文章的動機是兩個問題: 使用Windows記事本的「另存為」,可以在GBK、Unicode、Unicode big endian和UTF-8這幾種編碼方式間相互轉換。同樣是txt文件,Windows是怎樣辨識編碼方式的呢?
我很早前就發現Unicode、Unicode big endian和UTF-8編碼的txt文件的開頭會多出幾個字元,分別是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但這些標記是基於什麼標準呢?
big5的原文還是區位碼,從區位碼到內碼,需要在高字元和低字元上分別加上A0。
在DBCS中,GB內碼的存儲格式始終是big endian,即高位在前。
big5的兩個字元的最高位都是1。但符合這個條件的碼位只有128*128=16384個。所以GBK和GB18030的低字元最高位都可能不是1。不過這不影響DBCS字元流的解析:在讀取DBCS字元流時,只要遇到高位為1的字元,就可以將下兩個字元作為一個雙字元編碼,而不用管低字元的高位是什麼。
UTF-8 字元流(二進制) 0000 - 007F
0xxxxxxx 0080 - 07FF
110xxxxx 10xxxxxx 0800 - FFFF
1110xxxx 10xxxxxx 10xxxxxx 例如「漢」字的Unicode編碼是6C49。6C49在0800-FFFF之間,所以肯定要用3字元模板了:1110xxxx 10xxxxxx 10xxxxxx。將6C49寫成二進制是:0110 110001 001001, 用這個比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。 讀者可以用記事本測試一下我們的編碼是否正確。 UTF-16以16位為單元對UCS進行編碼。對於小於0x10000的UCS碼,UTF-16編碼就等於UCS碼對應的16位無符號整數。對於不小於0x10000的UCS碼,定義了一個算法。不過由於實際使用的UCS2,或者UCS4的BMP必然小於0x10000,所以就目前而言,可以認為UTF-16和UCS-2基本相同。但UCS-2只是一個編碼方案,UTF-16卻要用於實際的傳輸,所以就不得不考慮字元序的問題。 5、UTF的字元序和BOM UTF-8以字元為編碼單元,沒有字元序的問題。UTF-16以兩個字元為編碼單元,在解釋一個UTF-16文本前,首先要弄清楚每個編碼單元的字元序。例如收到一個「奎」的Unicode編碼是594E,「乙」的Unicode編碼是4E59。如果我們收到UTF-16字元流「594E」,那麼這是「奎」還是「乙」? Unicode規範中推薦的標記字元順序的方法是BOM。BOM不是「Bill Of Material」的BOM表,而是Byte Order Mark。BOM是一個有點小聰明的想法: 在UCS編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字元,它的編碼是FEFF。而FFFE在UCS中是不存在的字元,所以不應該出現在實際傳輸中。UCS規範建議我們在傳輸字元流前,先傳輸字元"ZERO WIDTH NO-BREAK SPACE"。 這樣如果接收者收到FEFF,就表明這個字元流是Big-Endian的;如果收到FFFE,就表明這個字元流是Little-Endian的。因此字元"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。 UTF-8不需要BOM來表明字元順序,但可以用BOM來表明編碼方式。字元"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF(讀者可以用我們前面介紹的編碼方法驗證一下)。所以如果接收者收到以EF BB BF開頭的字元流,就知道這是UTF-8編碼了。 Windows就是使用BOM來標記文本文件的編碼方式的。 6、進一步的參考資料 本文主要參考的資料是 "Short overview of ISO-IEC 10646 and Unicode" (http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)。 我還找了兩篇看上去不錯的資料,不過因為我開始的疑問都發現了答案,所以就沒有看:
- Jun 29 Tue 2010 16:36
-
澎湖學藝回來新竹開黑沙糖為主題的冰店-家竹黑砂糖冰品
- Jun 28 Mon 2010 18:38
-
馬與驢子
從前,有個人趕著一匹馬和一頭驢子上路。 路途中,驢子對馬說:“你若能救我一命,就請幫我分擔一點我的負擔吧。”馬不願意,驢子終因精疲力竭,倒下死了。 於是,主人把所有的貨物,包括那張驢子皮,都放在馬背上。這時,馬悲傷地說:“我真倒楣!我怎麽會受這麽大的苦呢?這全因不願分擔一點驢的負擔,現在不但馱上全部的貨物,還多加了一張驢皮。” 出處 : http://3w.epochtimes.com/b5/1/11/11/c6891.htm ================================================== 恩,在職場上面,到底是要把阻礙你升遷的人搞死?還是要和平共處?這個故事還真發人醒思。



















