Chapter 14. 中文程式設計

Table of Contents
14.1. 在 FreeBSD 下寫程式應該注意的問題
14.2. JSP / Servlet 怎樣才能處理中文?
14.3. Java 連結到 MySql 如何使用中文?
14.4. linux-gtk - gtk-1.2.6 的函式庫 rpm,有 Big5/GB 的支援
14.5. php 的 ImageTTFText() 經常抓錯字?
14.6. php 上傳中文檔名的檔案
14.7. 用 php 製作中文 PDF 檔
14.8. Tcl/Tk - 廣為運用的一種高階電腦語言與 GUI 發展工具
14.9. PostgreSQL 不能處理中文?
14.10. PostgreSQL + JDBC + Servlet + XMLC 中文完全解決方案
14.11. Java 中文程式設計
14.12. Perl 中文程式設計
14.13. MySQL Localisation and International Usage
14.14. 在 LDAP 下使用中文
14.15. 用 perl 寫 CGI 時的中文顯示問題?

以下是一些軟體在中文支援方面,利用程式的判斷。

原則上如果是用 gtk 寫的軟體,裡面有呼叫到 gtk_set_locale() 這個函式的話應該都沒問題。

如果是其他的 X 軟體可能要找一下 source 裡面有沒有 setlocale(LC_CTYPE, NULL); 及 XIM 相關函式呼叫情形。如果有遵照正統做法, xcin2.5 應該都可以跟它搭配良好。

Qt 沒碰過,所以不知道他怎麼運作。不過猜想 XIM 這段應該跟 gtk 大同小異。

用 xforms 寫的軟體應該會有問題。

用 X11R6.4 版以後的 Xt/Xaw 寫的軟體應該是沒問題, 記得在 .Xdefaults 裡頭加入 *international:true*fontSet:-*-iso8859-1,-*-16-*-big5-0 等等。

用 fltk 寫的軟體似乎也沒支援 XIM。

14.1. 在 FreeBSD 下寫程式應該注意的問題

在FreeBSD下寫程式,結果發現一個中文的問題, 例如字串中包含這"許"這個字,因為許字的下半碼是 ascii中的\符號,結果就會造成錯誤,請問這種情形 應該如何解決?又還有沒有其他的碼有這種問題?

在程式中該字前加一個 '\',還有很多有這個問題呢,如下:

5C  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
A0     ﹏ 兝 α 么 功 吒 吭 沔 坼 歿 俞 枯 苒 娉 珮
B0  豹 崤 淚 許 廄 琵 跚 愧 稞 鈾 暝 蓋 墦 穀 閱 璞
C0  餐 縷 擺 黠 孀 髏 躡 ツ \ 尐 佢 汻 岤 狖 垥 柦
D0  胐 娖 涂 罡 偅 惝 牾 莍 傜 揊 焮 茻 鄃 幋 滜 綅
E0  赨 塿 槙 箤 踊 嫹 潿 蔌 醆 嬞 獦 螏 餤 燡 螰 駹
F0  礒 鎪 瀙 酀 瀵 騱 酅 贕 鱋 鱭

'\' 的 ASCII code 是 \0x5c,從 [\0xa1-\0xf9][\0x5c] 都會有這個問題。

#!/usr/bin/perl
#
# create code table (Big5) [\0xa1-0xf9][\0x40-\0x7e\0xa1-\0xfe]
#

# 繁體中文 (Big5) 文字內碼表的產生
open (OUT, "> big55c.txt"); select OUT;

# 文字內碼表的產生
# 開頭的表示
print "\n5C  ";
print "+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F\n";
$c = 1; # 1行文字數(16文字)
$head = "";
$line = "";
for ($c1 = 0xA0; $c1 i<= 0xF9; $c1++) { # $c1 是第一個位元 [\0xa1-\0xf9]
    $c2=0x5c;
    # 開頭第一個字
    if ("$head" eq "") {
        $head = sprintf ("%02X ", $c1);
    }

    $line .= " "; # 文字間的空白
    if ($c1 == 0xA0) {
        $line .= "  ";
    } else {
        $line .= pack("CC", $c1, $c2);
    }

    if ($c == 16 || $c1 ==0xf9) { # 16文字表示一行
        print "$head$line\n";
        $head = "";
        $line = "";
        $c = 1;
    } else {
        $c++;
    }
}
close(OUT);

exit;