[分享] 打造 Unicode 的環境

常言道:『飲水思源』,在 Open Source 的世界裡,我們常常需要別人的幫助,但是在您有所心得的時候請記得分享給大家,『幫助人是快樂的喔』。歡迎您在使用 debian 的過程中的任何心得分享給大家。

[分享] 打造 Unicode 的環境

文章Tetralet » 週五 9月 17, 2004 9:25 pm

什麼是 Unicode?

  簡而言之, Unicode 為一 ISO 國際標準,
  它包含了世界各國的常用文字,目前已收錄有 8 萬(?) 個字以上。
  它的目的是統一世界各國之編碼,讓世界文字萬碼奔騰的狀況不復出現。

    註:UTF-8 為 Unicode 編碼方式之一,感謝 shogun1234 兄 指正!


為什麼要轉入 Unicode 環境?

  在這個資訊爆發的時代,國際化早就是無法抗拒之潮流。
  不管是在 Web 上、新聞、郵件、文件中,
  我們常常遇到必須處理多國文字的狀況。
  再加上 Big5 中文編碼上的設計缺陷以及字數嚴重不足等等問題,
  全面轉換至 Unicode 環境似乎是不可避免的...


在 Linux 中,如何轉入 Unicode 環境?

  請先產生 UTF-8 的 Locales,例:
代碼: 選擇全部
# 在 /etc/locale.gen 中,加入 zh_TW.UTF-8 UTF-8 及其它您所需要的 Locales。
cat >> /etc/locale.gen << EOF

en_US.UTF-8 UTF-8
ja_JP.EUC-JP EUC-JPja_JP.UTF-8 UTF-8
zh_TW.UTF-8 UTF-8

EOF

# 執行 locale-gen 來產生這些 locales 資訊檔。
locale-gen

  再設定好 Locale 的環境變數,
  就可以改變現正所使用的 Locale。
  您可以把這些環境變數寫在 ~/.bashrc、~/.xinitrc 或是 ~/.xsession 中,
  以 ~/.xinitrc 為例:
代碼: 選擇全部
#!/bin/sh
# $Xorg: xinitrc.cpp,v 1.3 2000/08/17 19:54:30 cpqbld Exp $

# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)

export LANG=zh_TW.UTF-8
export LC_ALL=zh_TW.UTF-8

# invoke global X session script
. /etc/X11/Xsession


在 Linux 上轉入 Unicode 環境時所帶來之挑戰及解決方案

 檔案名稱編碼問題

  檔案名稱的編碼影響到的將會是我們能否順利在 Linux 下看到正確的檔案名稱。

  如果是 vfat 的磁碟區,
  那麼內定就是使用 UTF-8 編碼來儲存檔名。
  所以只要使用以下方式來掛載 vfat 磁區,就可以無痛將檔案名稱轉換為 UTF-8 編碼了:
  (請將其寫在 /etc/fstab 裡)
代碼: 選擇全部
/dev/hda5  /FAT32  vfat  utf8=1,gid=disk,fmask=113,dmask=002,umask=002  0  0

  但,如果是 ext2/ext3 之類的磁碟區呢?
  Linux 所使用的 ext2/ext3 之類的磁碟區,
  在儲存檔名時是以其原始編碼存入磁碟的,
  所以我們可能需要某些工具程式來轉換這些檔案名稱,例如 convmv

代碼: 選擇全部
# 將在 /Path/To/Your/Files 裡的 Big5 編碼檔名轉換成 UTF-8 編碼
# 請用 ./convmv --help 或是 man ./convmv.1.gz 來得到其參數之說明
# 使用 --list 來查看已支援之編碼
# 其中,-f 為原始編碼,-t 為輸出編碼;-r 表是進行遞迴處理
# 以下將會輸出轉換結果,但不會實地進行轉換
./convmv -f big5-eten -t utf8 -r /Path/To/Your/Files

# 實地進行轉換
./convmv -f big5-eten -t utf8 -r --notest /Path/To/Your/Files

  筆者測試過,它可以成功轉換像是「功蓋許」等特殊檔名,是一個很不錯用的小程式。


 X Terminal

  我想,能夠完整支援 UTF-8 的 X Terminal 不少。
  其中,筆者所使用的是 MLTerm。

  為了能夠加快 MLTerm 的顯示速度,
  筆者關掉了它的 Anti-Alias 功能,並設定它在處理字串時採用 Unicode 編碼。
  (請修改 /etc/mlterm/main 或 ~/.mlterm/main)

代碼: 選擇全部
# 在處理字串時,如複製貼上時,將其轉換成 Unicode 編碼。
receive_string_via_ucs=true

# 不使用 Anti-Alias 字型。
use_anti_alias=false

  設定所使用的 Non-Anti-Alias 之 Unicode 字型:
  (請修改 /etc/mlterm/font 或 ~/.mlterm/font)

代碼: 選擇全部
ISO8859_1 = -gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1;
ISO10646_UCS4_1 = -gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1;
ISO10646_UCS4_1_BIWIDTH = -gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1;

  MLTerm 可以支援多國語系、支援 XIM、支援透明背景,
  也有 GUI 的設定介面,是不可多得的好 X Terminal!


 中文輸入法

  XCin 在加上一個 Patch 之後,就可以在 zh_TW.UTF-8 下運作了,
  而幸運的是,這個 Patch 已被 Debian 官方所接受,
  所以 Debian User 就不必費心去加 Patch 了。
  但是它必須先於 zh_TW.Big5 下執行,才能將 Locale 轉換為 zh_TW.UTF-8。

  以 ~/.xinitrc 為例:
代碼: 選擇全部
#!/bin/sh
# $Xorg: xinitrc.cpp,v 1.3 2000/08/17 19:54:30 cpqbld Exp $

# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)

export LC_ALL=zh_TW.Big5
export LANG=zh_TW.Big5

export XMODIFIERS="@im=xcin"
exec /usr/bin/xcin &

export LANG=zh_TW.UTF-8
export LC_ALL=zh_TW.UTF-8

# invoke global X session script
. /etc/X11/Xsession

  而像是 SCIM 等等輸入法則直接能夠在 zh_TW.UTF-8 環境下運作。
  如果您有興趣則不妨試試看!


 xlib based 程式:(xedit 等等)

  只要指定讓 xlib based 程式使用 Unicode 字型,如:unifont,
  應該就能讓 xlib based 程式在 Unicode 環境下運作。

  例,在 ~/.Xdefaults 裡頭加入:
代碼: 選擇全部
xedit*international: True
xedit*fontSet: -gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1

  就能讓 xedit 支援 Unicode 了。


 Gtk+ based 程式:(XMMS、GIMP 1.2 等等)

  只要在 /etc/gtk/gtkrc.utf-8 中指定讓 Gtk+ based 程式使用 Unicode 字型,如:
代碼: 選擇全部
style "default-text" {
       fontset = "-gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1"
}

class "GtkWidget" style "default-text"

  應該就能讓 xlib 程式在 Unicode 環境下順利運作。

  但是 XMMS 將也會以 UTF-8 編碼來讀取 ID3 tag,所以反而會在 XMMS 視窗裡出現亂碼。
  解決方案是把所有的 ID3 tag 轉換成 UTF-8 編碼,或是在播放時顯示檔案名稱。


 QT Based 程式

  為了能在 QT Based 的程式裡正常顯示 Unicode,
  建議您安裝支援 Unicode 的字型,如:DFSongSd.ttf
  並執行 qt-config,讓 QT Based 程式使用這個 Unicode 字型做為預設的字型。

    注意:DFSongSD.ttf 為 freeware,但是並不是 Free Software。
       請依您喜好來決定是否要下載使用這個字型。

  否則,在必須顯示多國文字時,常常看到的會是莫名其妙的空白...


 Gtk2+ Based 程式

  Gtk2+ Based 程式老早就使用 Unicode 做為預設編碼,
  所以在轉換至 Unicode 環境後更是如魚得水,
  可以說是完全不會遇到任何問題。
  我們可以在 ~/.gtkrc-2.0 中指定 Gtk2+ Based 程式的預設字型,例:
代碼: 選擇全部
gtk-font-name = "AR PL Kaitim Big5 14"

  而 Gtk2+ Based 的程式最可怕的一點是,如果它在該字型中找不到相對應的文字,例:
代碼: 選擇全部
映画 ジブリ [ 猫の恩返し ] 主題歌   風になる - つじあやの.ogg

  這串文字,其中的「映」「恩」等字,是可以在 文鼎字型 裡找到相對應的字;
  但剩下的「画」「猫」等字就找不到了。
  但是 Gtk2+ 的函式庫會自動使用其它的字型來把這些字給補滿,
  所以在 Mozilla 裡還是可以看到完整的字串。真的非常了不起!


 VIM

  VIM 則內建了方便的自動轉碼功能,
  方法是在 ~/.vimrc 中加入:
代碼: 選擇全部
" 設定自動轉換為 UTF-8 編碼
set fileencodings=utf-8,big5,euc-jp,gbk,euc-kr,utf-bom,iso8859-1
set encoding=utf8
set tenc=utf8

  它會自動偵測該文字檔是否為 Big5 / eucJP 等編碼,
  然後將其轉換為 UTF-8 編碼。
  但是在存檔時仍會以原有編碼儲存;
  如果能配合支援 UTF-8 的 X Terminal 那就更加完美了!


還有很多的程式,如 wxWidgets、Tcl/Tk 等等,
由於接觸的不多,所以不清楚它們對 Unicode 的支援程度到底是如何。
而這部份會儘快補完的!


本文也會同時放至 Debian Wiki 裡。請大家多多支持 Debian Wiki!
最後由 Tetralet 於 週五 10月 29, 2004 9:08 am 編輯,總共編輯了 1 次。
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:[分享] 打造 Unicode 的環境

文章訪客 » 週五 9月 17, 2004 9:32 pm

Unicode 在samba 上也可實做嗎?
訪客
 

re:[分享] 打造 Unicode 的環境

文章Tetralet » 週五 9月 17, 2004 10:03 pm

Anonymous 寫:Unicode 在samba 上也可實做嗎?

可以。

請在 /etc/samba/smb.conf 中加入:
代碼: 選擇全部
display charset = UTF8
dos charset = UTF8
unix charset = UTF8

然後重新啟動 Samba,
不管 Client 是 MS Windows 95/98/ME/NT/2000/XP/2003 或是 GNU/Linux,
就可以正確得讀取寫入 UTF-8 編碼的檔案名稱了。
您不妨試試看!

 註:MS Windows 95/98/ME 是不支援 UTF-8 的,
   所以它們可以正確處理 UTF-8 編碼之中文檔名,
   但卻無法處理 Big5 碼以外的檔案名稱。
   這是 MS Windows 95/98/ME 先天上的限制,
   (即使是以 MS Windows NT/2000/2003 為 Server 也會有類似的困擾)
   據個人所知,針對這個問題,
   目前並沒有什麼良好的解決方案。
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:[分享] 打造 Unicode 的環境

文章209088970 » 週日 9月 19, 2004 1:01 pm

請問一下可以用big5的中文字型嗎?

因為我找不到unicode的中文字型
.
圖檔
圖檔
頭像
209088970
活潑的高中生
活潑的高中生
 
文章: 352
註冊時間: 週日 5月 11, 2003 9:04 am

re:[分享] 打造 Unicode 的環境

文章hugh » 週日 9月 19, 2004 1:37 pm

請問一下,因我平時都是在console底下工作的,但是好像jmcce並沒有支援unicode的環境,所以當x-window裡面的unicode編碼的文件在console底下打開的話,好像就會亂掉了不能看,這樣好像會很亂呢,

那console底下有沒有支援unicode的中文系統(中文輸入也很方便的喲)
hugh
可愛的小學生
可愛的小學生
 
文章: 81
註冊時間: 週二 4月 15, 2003 5:26 am

re:[分享] 打造 Unicode 的環境

文章Tetralet » 週一 9月 20, 2004 8:48 am

209088970 寫:請問一下可以用big5的中文字型嗎?

因為我找不到unicode的中文字型

如果缺的是 fixed 的 Unicode 字型,
建議安裝 unifont 這個套件。

如果缺的是 TTF 的 Unicode 字型,
您可以考慮使用 DFSongSd.ttf(只有簡繁中文字和日文字)、
 微軟細明體(只有簡繁中文字和日文字)或 微軟 Arial Unicode MS(蠻完整的 Unicode 字型,但並不是很美觀)

  注意:DFSongSD.ttf 為 freeware,但是並不是 Free Software。
     請依您喜好來決定是否要下載使用這個字型。

     而 微軟細明體 或 微軟 Arial Unicode MS 則為商業軟體,
     在使用時請注意其授權合約之規範。
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:[分享] 打造 Unicode 的環境

文章Tetralet » 週一 9月 20, 2004 9:38 am

hugh 寫:請問一下,因我平時都是在console底下工作的,但是好像jmcce並沒有支援unicode的環境,所以當x-window裡面的unicode編碼的文件在console底下打開的話,好像就會亂掉了不能看,這樣好像會很亂呢

個人能想到的有兩個解決方法。

一個是在 ~/.vimrc 中加入:
代碼: 選擇全部
" 使用 <F12> 來將文字編碼轉換成 Big5
map <F12> :set tenc=big5<cr>

那麼,
在 zh_TW.Big5 的環境下,
就可以按下 <F12> 來強迫 VIM 使用 Big5 編碼。

 註:個人對 VIM Script 不熟,
   我本來是希望能做到按下 <F12>,它會改由 Big5 編碼;
   再按下 <F12>,它會改由 gb 編碼;
   再按下 <F12>,它會改由 euc-jp 編碼;
   再按下 <F12>,它會改由 utf-8 編碼...
   可是我寫不出來... :y2_07:


另外一個方法是將
代碼: 選擇全部
" 設定自動轉換為 UTF-8 編碼
set fileencodings=utf-8,big5,euc-jp,gbk,euc-kr,utf-bom,iso8859-1
set encoding=utf8
set tenc=utf8

寫入 .uvimrc 中,
然後在 zh_TW.UTF-8 中使用 vim -u .uvimrc,
(或是使用 alias uvim='vim -u .uvimrc')
而 zh_TW.Big5 中則使用一般的 vim。
個人試過,
在 CRXVT/zhcon 中是可以使用,沒問題的。
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

Re: [分享] 打造 Unicode 的環境

文章Tetralet » 週一 9月 20, 2004 11:01 am

Tetralet 寫: VIM

  VIM 則內建了方便的自動轉碼功能,
  方法是在 ~/.vimrc 中加入:
代碼: 選擇全部
" 設定自動轉換為 UTF-8 編碼
set fileencodings=utf-8,big5,euc-jp,gbk,euc-kr,utf-bom,iso8859-1
set encoding=utf8
set tenc=utf8

  它會自動偵測該文字檔是否為 Big5 / eucJP 等編碼,
  然後將其轉換為 UTF-8 編碼。
  但是在存檔時仍會以原有編碼儲存;
  如果能配合支援 UTF-8 的 X Terminal 那就更加完美了!

對了,
差點忘了說。

VIM 這一招是學自 Kanru 兄,
請參考:

 [問題]請教 Big5 轉換到 UTF-8
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:[分享] 打造 Unicode 的環境

文章Tetralet » 週三 9月 22, 2004 6:07 pm

在 MS Windows 的網路芳鄰中使用 Unicode:

 修改 /etc/samba/smb.conf 如下:
代碼: 選擇全部
   display charset = UTF8
   dos charset = CP950
   unix charset = UTF8


 並使用以下參數來掛載 MS Windows Server 之分享目錄:

代碼: 選擇全部
mount -t smbfs -o username=*UserName*,codepage=cp950,iocharset=utf8 //FileServer/共用區 /mnt

 就可以在 LinNeighborhood 及 smbclient 所掛載的目錄中使用 Unicode 編碼之檔案名稱及目錄了。
 不過僅限於使用 Big5 編碼之 Unicode 檔名...


真不知 MS Windows 2000/XP 的 Client 是如何能夠使用 Unicode 來存取 MS Window 2000 Server 的...?
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:[分享] 打造 Unicode 的環境

文章chinson » 週四 9月 23, 2004 10:39 pm

Tetralet 寫:並使用以下參數來掛載 MS Windows Server 之分享目錄:
代碼: 選擇全部
mount -t smbfs -o username=*UserName*,codepage=cp950,iocharset=utf8 //FileServer/共用區 /mnt

 就可以在 LinNeighborhood 及 smbclient 所掛載的目錄中使用 Unicode 編碼之檔案名稱及目錄了。
 不過僅限於使用 Big5 編碼之 Unicode 檔名...

有點不懂...使用 "mount -t smbfs...." 之後,為何還需要用到 LinNeighborhood ??又或者 Tetralet 兄是指可以在 LinNeighborhood 中使用這個指令?


另外 Tetralet 兄所提 mount -t smbfs 的指令僅能由 root 使用,如果要由一般使用者來設,當然就是用 smbmount 囉。
代碼: 選擇全部
smbmount //FileServer/共用區 $HOME/mnt -o username=*UserName*,codepage=cp950,iocharset=utf8


既然使用 smbmount 可以,而 LinNeighborhood 又是使用 smbmount 指令,所以我試著將偏好設定裡 smbmount 的 argument 設為
代碼: 選擇全部
-o username=*UserName*,codepage=cp950,iocharset=utf8

=> 不行...掛載後發現中文檔名還是亂碼 :kuso_1.13:
不知 Tetralet 兄是否有測過 LinNeighborhood ?
最後由 chinson 於 週四 10月 28, 2004 4:14 pm 編輯,總共編輯了 1 次。
輕鬆式生活
================================
http://blog.chinson.idv.tw/
頭像
chinson
懵懂的國中生
懵懂的國中生
 
文章: 117
註冊時間: 週一 5月 17, 2004 7:18 pm
來自: 高雄市

re:[分享] 打造 Unicode 的環境

文章Tetralet » 週五 9月 24, 2004 8:46 am

chinson 寫:既然使用 smbmount 可以,而 LinNeighborhood 又是使用 smbmount 指令,所以我試著將偏好設定裡 smbmount 的 argument 設為
代碼: 選擇全部
-o username=*UserName*,codepage=cp950,iocharset=utf8

=> 不行...掛載後發現中文檔名還是亂碼 :kuso_1.13:
不知 Tetralet 兄是否有測過 LinNeighborhood ?

在設定 LinNeighborhood 的 smbmount 之 argument 時,
不用加上 "-o" 這個選項;
而 username 選項也可以省略,
因為這些選項 LinNeighborhood 會自動替您加上去。

例:(我在 LinNeighborhood 裡使用的 smbmount 之 argument)
代碼: 選擇全部
codepage=cp950,iocharset=utf8

的確是可以在 zh_TW.UTF-8 的環境下使用 Unicode 的網路芳鄰。

請您測試看看呦!
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:[分享] 打造 Unicode 的環境

文章yucon » 週五 9月 24, 2004 10:20 am

問一個比較偏的問題usb隨身碟可以format成別的格式嗎?
在UTF8環境下把UTF-8檔名的程式存入隨身碟的FAT格式中都會變亂碼
除了先tar壓制起來有比叫好的解決方法嗎?
yucon
可愛的小學生
可愛的小學生
 
文章: 78
註冊時間: 週日 6月 20, 2004 12:12 am

re:[分享] 打造 Unicode 的環境

文章Tetralet » 週五 9月 24, 2004 10:49 am

yucon 寫:問一個比較偏的問題usb隨身碟可以format成別的格式嗎?

我的是可以啦...

我還把我的 FD Card 格式化為 ext3 使用呢!

yucon 寫:在UTF8環境下把UTF-8檔名的程式存入隨身碟的FAT格式中都會變亂碼

在掛載 FAT 分割區時,
記得要加上 utf8=1 參數呦!
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:[分享] 打造 Unicode 的環境

文章yucon » 週五 9月 24, 2004 11:02 am

原來這樣子就可以了@@
之前編譯kernel時看到FAT 預設charset選項特別注明FAT不支援UTF8還以為真的沒有辦法了@@
yucon
可愛的小學生
可愛的小學生
 
文章: 78
註冊時間: 週日 6月 20, 2004 12:12 am

re:[分享] 打造 Unicode 的環境

文章訪客 » 週日 9月 26, 2004 5:55 pm

今天玩玩打造 UTF-8 環境 .... using sarge

用 zh_TW.UTF-8 為 locale ... and wmaker .... and scim

startx 後 wmaker display english, scim 沒有出來.

.xinitrc
export LC_ALL=zh_TW.UTF-8
export LANG=zh_TW.UTF-8
export XMODIFIERS="@im=SCIM"
exec scim -d &
sleep 1
exec wmaker

Check .xsession-errors 郤看到

/usr/bin/WindowMaker warning: X server does not support locale
/usr/bin/WindowMaker warning: cannot set locale modifiers
/usr/bin/WindowMaker warning: could not open IM
/usr/bin/WindowMaker warning: could not load font -*-helvetica-medium-r-normal*-12-*-*-*-*-*-*-*-*,-*-*-medium-r-*-*-12-*-*-*-*-*-*-*-*. Trying fixed.
etc. etc.

唔知做錯什麼呢 ???
訪客
 

下一頁

回到 share

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客