[模組及開講] 正簡中文轉換與 UTF-8, Unciode

phpBB 2 MOD Support
無論是官方或非官方認證之外掛,安裝與使用問題討論。
(發表文章請按照公告格式發表,違者砍文)

版主: 版主管理群

CRLin
星球公民
星球公民
文章: 147
註冊時間: 2002-11-13 08:36
聯繫:

[模組及開講] 正簡中文轉換與 UTF-8, Unciode

文章 CRLin »

正簡中文轉換模組(採用 UTF-8 ):
請參閱 http://web.dhjh.tcc.edu.tw/~gzqbyr/foru ... ic.php?t=1

參考資料:
http://www.cl.cam.ac.uk/~mgk25/unicode.html
http://zh.wikipedia.org/wiki/UTF-8
http://www-128.ibm.com/developerworks/c ... index.html
http://www.linuxforum.net/books/UTF-8-Unicode.html

Unicode 的編碼和實現

Unicode(萬國碼、統一碼)是一種在計算機(電腦)上使用的字符(字元)編碼。它為每種語言中的每個字符設定了統一並且唯一的二進制編碼,以滿足跨語言、跨平台進行文件轉換、處理的要求。1990年開始研發,1994年正式公布。隨著計算機工作能力的增強,Unicode也在面世以來得到普及。

編碼方式:
Unicode 的編碼方式與 ISO 10646 的通用字符集(Universal Character Set,UCS)概念相對應,使用16位的編碼空間。也就是每個字符占用2個字節(位元組byte),基本上滿足了各種語言的使用。

實現方式:
Unicode 的實現方式不同於編碼方式。一個字符的 Unicode 編碼是確定的。但是在實際傳輸過程中,由於不同系統平台的設計不一定一致,以及出於節省空間的目的,對 Unicode 編碼的實現方式有所不同。Unicode 的實現方式稱為Unicode轉換格式(Unicode Translation Format,簡稱為 UTF)。
例如,如果一個僅包含基本7位ASCII字符的 Unicode 文件,如果每個字符都使用2字節的原 Unicode 編碼傳輸,其第一字節的8位始終為0。這就造成了比較大的浪費。對於這種情況,可以使用 UTF-8 編碼。

XML 和 Unicode:
XML及其子集HTML採用UTF-8作為標准字集,理論上我們可以在各種支持XML標准的瀏覽器上顯示任何地區文字的網頁,只要電腦本身安裝有合適的字體即可。可以利用&#nnn;的格式顯示特定的字符。nnn代表該字符的十進制 Unicode 代碼。如果採用十六進制代碼,在編碼之前加上x字符即可。但部分舊版本的瀏覽器可能無法識別十六進制代碼。

UTF-8

UTF-8的編碼模式:
* UCS 字符 U+0000 到 U+007F (ASCII) 被編碼為字節 0x00 到 0x7F (ASCII 兼容). 這意味著只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 兩種編碼方式下是一樣的.
* 所有 >U+007F 的 UCS 字符被編碼為一個多個字節的串, 每個字節都有標記位集. 因此, ASCII 字節 (0x00-0x7F) 不可能作為任何其他字符的一部分.
* 表示非 ASCII 字符的多字節串的第一個字節總是在 0xC0 到 0xFD 的範圍裡, 並指出這個字符包含多少個字節. 多字節串的其餘字節都在 0x80 到 0xBF 範圍裡.

UTF-8儲存的字元,除了第一個位元組外,其餘位元組的頭兩個位元都是以 "10" 開始,使文字處理器能夠較快地找出每個字元的開始位置。

代碼: 選擇全部

* 0xxxxxxx                                               (00-7f)
* 110xxxxx 10xxxxxx                                      (c0-df)(80-bf)
* 1110xxxx 10xxxxxx 10xxxxxx                             (e0-ef)(80-bf)(80-bf)
* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx                    (f0-f7)(80-bf)(80-bf)(80-bf)
* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx           (f8-fb)(80-bf)(80-bf)(80-bf)(80-bf)
* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  (fc-fd)(80-bf)(80-bf)(80-bf)(80-bf)(80-bf)
例如: Unicode 字符 U+00A9 = 1010 1001 (版權符號) 在 UTF-8 裡的編碼為:
11000010 10101001 = 0xC2 0xA9
而字符 U+2260 = 0010 0010 0110 0000 (不等於) 編碼為:
11100010 10001001 10100000 = 0xE2 0x89 0xA0

UTF-8 與 Unciode 的 PHP 碼轉換:
底下 Javascript 碼取得'貓'的 unicode, 注意: charset=big5

代碼: 選擇全部

<meta http-equiv="Content-Type" content="text/html; charset=big5">
<script>
var Str = "貓";
TempStr = Str.charCodeAt(0);
document.write(TempStr);
</script>
UTF-8 與 Unciode 的 PHP 碼轉換:

代碼: 選擇全部

$uni_code = 0x4ed7; // 仗 的 unicode 編碼 0x4ed7;
echo '&#'.$uni_code.'<br>';
$utf8_char = uni2utf($uni_code);
echo $utf8_char.'<br>';
$uni_code = utf2uni($utf8_char);
echo '&#'.$uni_code.'<br>';

// Return utf-8 character
function uni2utf($uni_code)
{
	if ($uni_code<0x80) return chr($uni_code);
	$i=0;
	$outstr='';
	while ($uni_code>63) // 2^6=64
	{
		$outstr=chr($uni_code%64+0x80).$outstr;
		$uni_code=floor($uni_code/64);
		$i++;
	}
	switch($i)
	{
		case 1:
			$outstr=chr($uni_code+0xC0).$outstr;break;
		case 2:
			$outstr=chr($uni_code+0xE0).$outstr;break;
		case 3:
			$outstr=chr($uni_code+0xF0).$outstr;break;
		case 4:
			$outstr=chr($uni_code+0xF8).$outstr;break;
		case 5:
			$outstr=chr($uni_code+0xFC).$outstr;break;
		default:
			echo "unicode error!!";exit;
	}
	return $outstr;
}

// Return unicode
function utf2uni($utf8_char)
{
	$ch=ord(substr($utf8_char,0,1));
	if ($ch<0x80) return $ch;
	if ($ch>0xBF && $ch<0xFE)
	{
		if ($ch<0xE0) {
			$i=1;
			$uni_code=$ch-0xC0;
		} elseif ($ch<0xF0)	{
			$i=2;
			$uni_code=$ch-0xE0;
		} elseif ($ch<0xF8)	{
			$i=3;
			$uni_code=$ch-0xF0;
		} elseif ($ch<0xFC)	{
			$i=4;
			$uni_code=$ch-0xF8;
		} else {
			$i=5;
			$uni_code=$ch-0xFC;
		}
	} else {
		echo "UTF-8 code error!!";exit;
	}
	
	for ($j=0;$j<$i;$j++)
	{
		$ch=ord(substr($utf8_char,$j+1,1))-0x80;
		$uni_code=$uni_code*64+$ch;
	}
	return $uni_code;
}
底下的 PHP 碼可查出本站所提供的簡體轉繁體之對應:

代碼: 選擇全部

$fd = fopen("gb2big.map",'r');
$str1 = fread($fd,filesize("gb2big.map"));
fclose($fd);
for ($i=0;$i<strlen($str1);$i=$i+4)
{
	$ch1=ord(substr($str1,$i,1))*256;
	$ch2=ord(substr($str1,$i+1,1));
	$ch1=$ch1+$ch2;
	$ch3=ord(substr($str1,$i+2,1))*256;
	$ch4=ord(substr($str1,$i+3,1));
	$ch3=$ch3+$ch4;
	echo '&#'.$ch1.', &#'.$ch3.'<br>';
}
最後由 CRLin 於 2006-05-19 10:36 編輯,總共編輯了 1 次。
CRLin的簽名檔:
My phpBB3 - http://web.dhjh.tc.edu.tw/~gzqbyr/phpBB
My FluxBB - http://web.dhjh.tc.edu.tw/~gzqbyr/fluxbb (快速、輕巧、方便使用的論壇程式)
jwxinst
竹貓忠實會員
竹貓忠實會員
文章: 945
註冊時間: 2006-03-31 10:07
來自: New York, USA     學業狀況: 當天才...       個人狀況: 臭蛋
聯繫:

文章 jwxinst »

噢!
先感謝crlin大
之前也麻煩了你很多
呵呵!!!!偶就方便了...這樣下
目前狀態圖檔
GoKo Music進度: 10%

問個問題不要緊可是沒有發文格式、問題不夠詳細情況,難道要用猜嗎?
新手必讀
[教學] 基本認識、學習、隨我架設phpBB的新手通 -更新至2.0.22
問問題的技巧
http://www.phpbb-tw.net/phpbb/viewtopic.php?t=44340
MOD安裝教學及轉碼
http://www.phpbb-tw.net/phpbb/viewtopic.php?t=22832
CRLin
星球公民
星球公民
文章: 147
註冊時間: 2002-11-13 08:36
聯繫:

繁體簡體的轉換對應

文章 CRLin »

jwxinst 寫:噢!
先感謝crlin大
之前也麻煩了你很多
呵呵!!!!偶就方便了...這樣下
謝謝回應!
這模組寫的'蠻辛苦'!
為了使大家更清楚為何要介紹 unicode, 特別加了底下的 PHP 碼, 請先下載提供的檔案.

底下的 PHP 碼可查出本站所提供的簡體轉繁體之對應:

代碼: 選擇全部

$fd = fopen("gb2big.map",'r');
$str1 = fread($fd,filesize("gb2big.map"));
fclose($fd);
for ($i=0;$i<strlen($str1);$i=$i+4)
{
	$ch1=ord(substr($str1,$i,1))*256;
	$ch2=ord(substr($str1,$i+1,1));
	$ch1=$ch1+$ch2;
	$ch3=ord(substr($str1,$i+2,1))*256;
	$ch4=ord(substr($str1,$i+3,1));
	$ch3=$ch3+$ch4;
	echo '&#'.$ch1.', &#'.$ch3.'<br>';
}
CRLin的簽名檔:
My phpBB3 - http://web.dhjh.tc.edu.tw/~gzqbyr/phpBB
My FluxBB - http://web.dhjh.tc.edu.tw/~gzqbyr/fluxbb (快速、輕巧、方便使用的論壇程式)
DL
竹貓忠實會員
竹貓忠實會員
文章: 717
註冊時間: 2005-03-05 15:29

文章 DL »

那麼如果我想改成,是以個人資料的語系設定作為依據,又該如何改
CRLin
星球公民
星球公民
文章: 147
註冊時間: 2002-11-13 08:36
聯繫:

文章 CRLin »

DL 寫:那麼如果我想改成,是以個人資料的語系設定作為依據,又該如何改
Sorry! 不太明白你的意思.
CRLin的簽名檔:
My phpBB3 - http://web.dhjh.tc.edu.tw/~gzqbyr/phpBB
My FluxBB - http://web.dhjh.tc.edu.tw/~gzqbyr/fluxbb (快速、輕巧、方便使用的論壇程式)
DL
竹貓忠實會員
竹貓忠實會員
文章: 717
註冊時間: 2005-03-05 15:29

文章 DL »

就是說,你本來的設定是按下「繁體中文」或「简体中文」就可以轉換,但我覺得這樣不太好,我想改成為在編輯個人資料→偏好設定→語系設定中設定用簡體或是繁體,請問該如何改
kiang
星球普通子民
星球普通子民
文章: 26
註冊時間: 2002-07-13 11:33
聯繫:

文章 kiang »

看樣子像是以 big5 & gb 當作中間碼的轉換,這有可能存在缺字問題,不妨試試這個:
http://twpug.net/modules/wfdownloads/si ... 27&lid=656
****************************************************
Finjon Kiang / 江明宗
Just This Computer Studio / 就這間電腦工作室
Website: http://olc.tw
****************************************************
CRLin
星球公民
星球公民
文章: 147
註冊時間: 2002-11-13 08:36
聯繫:

文章 CRLin »

DL 寫:就是說,你本來的設定是按下「繁體中文」或「简体中文」就可以轉換,但我覺得這樣不太好,我想改成為在編輯個人資料→偏好設定→語系設定中設定用簡體或是繁體,請問該如何改
謝謝你的意見!
每個人都有自己的'偏好',按下「简体」後, 所有資料皆以简体顯示應可'接受'.

於 個人資料→語系設定中設定用簡體後, 所有資料皆以简体顯示, 當然可以達成, 只是修改'程式'有得!
CRLin的簽名檔:
My phpBB3 - http://web.dhjh.tc.edu.tw/~gzqbyr/phpBB
My FluxBB - http://web.dhjh.tc.edu.tw/~gzqbyr/fluxbb (快速、輕巧、方便使用的論壇程式)
CRLin
星球公民
星球公民
文章: 147
註冊時間: 2002-11-13 08:36
聯繫:

文章 CRLin »

kiang 寫:看樣子像是以 big5 & gb, ...
非 big5 & gb, 本程式利用 unicode 與 UTF-8 的轉換. 其實是'借用' http://home.pchome.com.tw/world/ness729 ... gbbig5.htm

修改提供的 PHP script, 亦可適用 Discuz. DEMO: http://web.dhjh.tcc.edu.tw/~gzqbyr/Discuz/
CRLin的簽名檔:
My phpBB3 - http://web.dhjh.tc.edu.tw/~gzqbyr/phpBB
My FluxBB - http://web.dhjh.tc.edu.tw/~gzqbyr/fluxbb (快速、輕巧、方便使用的論壇程式)
DL
竹貓忠實會員
竹貓忠實會員
文章: 717
註冊時間: 2005-03-05 15:29

文章 DL »

CRLin 寫:
DL 寫:就是說,你本來的設定是按下「繁體中文」或「简体中文」就可以轉換,但我覺得這樣不太好,我想改成為在編輯個人資料→偏好設定→語系設定中設定用簡體或是繁體,請問該如何改
謝謝你的意見!
每個人都有自己的'偏好',按下「简体」後, 所有資料皆以简体顯示應可'接受'.

於 個人資料→語系設定中設定用簡體後, 所有資料皆以简体顯示, 當然可以達成, 只是修改'程式'有得!
那我自己再想辦法好了
chiouss
竹貓忠實會員
竹貓忠實會員
文章: 1741
註冊時間: 2002-11-29 18:19

文章 chiouss »

DL 要的東西應該是把所有的 text 部份輸出之前根據使用者的選擇做一次 iconv 轉成 gb2312 or big5,要寫出來應該不是困難。

但是我覺得與其這樣弄還不如保持使用 utf8,然後讓使用者去裝 AliBarbar 之類的軟體,可以做繁簡轉換還會順便修正用語,比較乾脆。
CRLin
星球公民
星球公民
文章: 147
註冊時間: 2002-11-13 08:36
聯繫:

文章 CRLin »

chiouss 寫:... 還不如保持使用 utf8,然後讓使用者去裝 AliBarbar 之類的軟體,可以做繁簡轉換還會順便修正用語,比較乾脆。
chiouss 所言極是!
CRLin 曾有此妄想: 簡體(或繁)轉換後, 順便修正用語 ( PHP 應當有此能力)。
但這想法的缺點是: 速度可能變得像'蝸牛'。
CRLin的簽名檔:
My phpBB3 - http://web.dhjh.tc.edu.tw/~gzqbyr/phpBB
My FluxBB - http://web.dhjh.tc.edu.tw/~gzqbyr/fluxbb (快速、輕巧、方便使用的論壇程式)
harryhsw
星球普通子民
星球普通子民
文章: 4
註冊時間: 2006-07-11 12:01

[外掛] 请问一下

文章 harryhsw »

除了简体和繁体的转换,可以有其他吗,譬如加上英文和韩语这样!
CRLin
星球公民
星球公民
文章: 147
註冊時間: 2002-11-13 08:36
聯繫:

Re: [外掛] 请问一下

文章 CRLin »

harryhsw 寫:除了简体和繁体的转换,可以有其他吗,譬如加上英文和韩语这样!
這應是不可能的!
CRLin的簽名檔:
My phpBB3 - http://web.dhjh.tc.edu.tw/~gzqbyr/phpBB
My FluxBB - http://web.dhjh.tc.edu.tw/~gzqbyr/fluxbb (快速、輕巧、方便使用的論壇程式)
harryhsw
星球普通子民
星球普通子民
文章: 4
註冊時間: 2006-07-11 12:01

[外掛] 我想再问一下

文章 harryhsw »

是很难实现的吗?还是怎样,我见到http://www.cnphpbb.com/forum/index.php
这个网站可以实现语言的选择的!但是我不知道怎样才能实现,我把他们的源代码也下载了,不知道怎样才能实现这个功能!
主題已鎖定

回到「外掛問題討論」