JeffHung.Blog

(My smile insists of having nose. :-)

Consolas in Windows Console

蒙 othree 於 #happydesigner 開示,知道了怎樣在 Windows 的 console 視窗,也就是「命令提示字元」程式,使用 Consolas 這類漂亮的字形。

Perl with UTF-8 mode

發現其實我沒對這個作筆記,剛好和 PipperL 在他的 blog 裡聊到,就順便作個簡單的說明好了。

問題描述
為什麼要用 UTF-8 mode 執行 perl 呢?因為 Perl 的字串預設是 byte string,對於使用 ASCII 的人來說,沒有影響,但對於 CJK 使用者來說,就很麻煩。舉例來說,以下程式使用的 regular expression 會無法正確 match 出「英」字,因為其 big5 碼的第二個 byte 是 '^' 符號,導致 regular expression 錯誤:

SHELL> more -x4 plain.pl#!/usr/bin/perl -w# Source encoded in big5.my $s = '英雄人物';if ($s =~ m/英/o) { print "是我\n";}else { [...]

Ideogram sensitive PostTeaser

睡到一半口渴睡不著,所以就來裝裝 wordpress plugins,找到一個 PostTeaser 看起來還不錯,所以就裝起來試試看。PostTeaser 是一個 excerpt 的加強版,其簡介是說:

Post Teaser generates a preview or "teaser" of a post for the main, archive and category pages, with a link underneath to go to the full post page. It includes features to generate a word count, image count, and an estimated reading time.

可惜,裝起來後發現,他的 word count 對中文字感冒,連帶地也算不準 excerpt 的長度。如果是中文字比較多的文章,很容易就帶出一大票文字,喪失了使用 [...]

Right libiconv version for Windows

最近在整合 libiconv,希望能夠解決一些跨平台[1]文字轉碼的問題。程式寫得很高興,結果移到 Windows 上一執行,卻不能執行,檢查的結果,是不支援 WCHAR_T,嘗試改轉成 UCS-2LE 或是 UTF-16LE,雖然可以轉,但有些字還是會爛掉。經過追查的結果發現,一切都是版本的問題。
對於曾經體驗過 GNU、Linux 以及其他 Open Source 軟體的好處的人來說,如果能夠也在 Windows 平台上,使用這些工具,那可真是一大樂事,多少能夠讓 Windows 變得稍微好用一些。因此,一直以來,這些 open source 軟體,不斷有官方或非官方的人或組織,在進行著 windows porting 的工作。大喀的有 Cygwin/MingGW,小喀的也有 UnxUtils 這類計畫存在[2]。而在 libiconv 的官方網站裡,也可以下載的到一個叫做 libiconv-1.9.1.bin.woe32.zip 的特別版本,將這個版本解開後,通常是放到 C:\usr 下,設定好 PATH 環境變數,即可使用。這正是原本我在 Windows 上使用的 libiconv 版本。
但今天卻發現,這個 1.9.1-woe32 的版本,compile/link 程式都沒有問題,但就是沒有 WCHAR_T,也會讓 UCS-2LE 或 UTF-16LE 的某些字爛掉。測了一下從 google 找到的幾個 libiconv for windows implementation,發現 GnuWin32 所提供的 libiconv,並沒有這個問題。換用了這個版本,跑一遍所有的 [...]

Subversion Issue 2332: Keyword expansion in non-UTF8 documents results in mixed charsets

差不多在幾個月前開始,用 TortoiseSVN 時,若程式裡有放 expansion keywords 的話,$Date$ 會被改成用 zh_TW.UTF-8 顯示。由於 C/C++ standard 規定,程式碼裡只應該使用 ASCII 碼,所以使用中文顯示 $Date$,會違反 C/C++ standard 規定。果不其然,上禮拜我就碰到了。為了要把程式移轉過去,測一測 Visual Studio .Net 2005,結果一編譯,洋洋灑灑跑出三百多個 warning,仔細一看,通通都是一樣的 warning:

warning C4819: The file contains a character that cannot be represented in the current code page (950). Save the file in Unicode format to prevent data loss    j:\wc\libmmi2\src\mmi2\mmi2.assert.cpp    1   

這可真是天大的麻煩啊,一個檔案就跑一個 warning 出來,project 一大,還真累人。所以我只好乖乖地去 [...]

GCC and customizable input source charset

研究過 BBS source 的人應該都知道一個很有名的 BIG5 衝碼問題:"壞蛋許\\n"。由於 GCC 跟 VC6 在此處的作法不太一樣。對於 GCC 而言,輸入的程式碼,是一串 bytes,而 VC6 在中文 Windows 裡,則是會把輸入的程式碼,看做是一串 big5 字元,而不只是一串 bytes 而已,所以必須用醜陋的 #ifdef 法,特別為含有「許功蓋」的 string literals[1],各寫一個版本,像這樣:

#if (ADK_COMPILER == ADK_COMPILER_MSC)
printf("壞蛋許\n");
#else if (ADK_COMPILER == ADK_COMPILER_GCC)
printf("壞蛋許\\n");
#endif

把輸入的程式碼,看做是一串 bytes,因此,含有反斜線的「許」字放在 string literals 裡,就必須多加一個反斜線在後面。這樣其實很難用,我常為了要讓程式可以同時 porting 在奮鬥。不過,難用歸難用,但按照 C++98,GCC 的作法,才是比較對的 (雖然也沒有算是完全正確)。
在 Standard C++ 2.2.1 裡指出:

The basic source [...]

List non utf-8 encoded files

Arlo 問我有沒有辦法讓 Editplus 2 預設使用 UTF-8 encoding?很可惜地,雖然 Editplus 2 可以預設檔案的行尾要用 PC (CR-LF)、UNIX (LF) 還是 Mac (CR) 格式,但卻沒有辦法預設新檔案要使用的 encoding,一律使用 ANSI codepage。
Arlo 問這個問題,想必是因為常常忘了把原始碼檔案的 encoding 設成 UTF-8,導致程式執行時出錯。我以前也有碰過這樣的困擾,於是從某 trac 資料庫裡把下面這段挖出來:

Here's a command to check which file has incorrect utf8 encoding:

SHELL> find . -type f -name '*.php' -or -name '*.html' -or -name '*.htm' \
 | [...]

How bad wide character/string support in FreeBSD 4 is

我總‧是‧說,FreeBSD 5 比 FreeBSD 4 好很多,因為 wide character/string support 在 FreeBSD 4 上,根本就是殘廢狀態。但到底差了多少呢?我一直也都說不上來。
今天看到 ijliao's blog 的這篇《FreeBSD 官方網頁改版》,跑去參訪了一下新版的 FreeBSD.org,結果逛到 FreeBSD C99 and POSIX® Conformance Project,從最後一個表「Wide Character/String Support」裡,終於知道 FreeBSD 4 的 wide character/string support,到底有多殘廢。
看著整排的 N/A,心中不禁感嘆,還好我在一年前就毅然決然地 migrate 到 FreeBSD 5 了,要不然開著殘廢破車寫一大堆需要 i18n 的程式,肯定痛苦要死。

Calling VC-made DLL from VB

記錄一下從 VB 呼叫用 VC 製作的 DLL 的心得:
1. 使用 __stdcall 搭配 .def 檔製作 DLL VC 製作 DLL 的方法。
有兩種方法。
第一種方法是使用 __declspec(dllexport) 宣告要 export 的函式,讓 VC 幫忙製作 stub library,這時預設使用的 calling convension 是 __cdecl。這樣宣告後,VC 會產出 libFoo.dll 與 libFoo.lib 兩個檔案,其中後者就是所謂的 stub library,VC 會自動於 stub library 裡製作對應到 libFoo.dll 裡 _funcFoo 這個 symbol 的 __imp_funcFoo。
這個方法的好處是,在 VC 裡的 project 有 dependency 時,會自動 [...]

轉換 BIG5、GB2312、UTF-8、Unicode 與 wchar_t

在硬碟裡發現這篇去年寫的舊文,放到 blog 上備查。

單純轉換
我們大致上會需要以下幾種 encoding 之間的相互轉換。

BIG5
GB2312
UTF-8
Unicode
wchar_t

其中,Unicode 指 UCS2-LE、UCS2-BE、UCS4-LE 或 UCS4-BE 等 encoding,而 wchar_t 則視平台而定。純粹的 encoding 互轉的話,由於 Unicode 號稱能納萬物,所以建議的轉換程序如下:

BIG5 <-> Unicode/UTF-8
BIG5 -> Unicode/UTF-8 -> GB2312
GB2312 <-> Unicode/UTF-8
GB2312 -> Unicode/UTF-8 -> BIG5

而若以「外部檔案用與平台無關的 encoding 如 BIG5、GB2312 或 UTF-8,內部程式使用 wchar_t 執行演算法」的準則來看的話,我們會需要以下幾種 encoding 轉換:

BIG5 <-> wchar_t
GB2313 <-> wchar_t
UTF-8 <-> wchar_t

進階轉換
另外,除了純粹的 encoding 轉換之外,也許有時還會需要更進一步的轉換機制:

處理非一對一對應:好比在繁簡體中文之間,有所謂一對多的困擾,一個簡體字,可能對應到多個繁體字。若有能夠依據前後文決定如何選取一對多的多個字中的哪一個字,這樣子的轉換會比單純的 encoding 轉換還要來得精準。
詞彙轉換:能轉換同義異形的兩岸詞彙用語。

轉換工具:libiconv
在 UNIX 上,首推 iconv,這是 libiconv 的 command-line [...]

 1 2 Next