[已解決] 論壇採 UTF-8 編碼後, 造成部分會員名稱末端出現亂碼?

phpBB Installation & Usage Support
phpBB 2 安裝於各類型作業平台之問題討論;外掛問題,請到相關版面依發問格式發表!
(發表文章請按照公告格式發表,違者砍文)

版主: 版主管理群

版面規則
本區是討論關於 phpBB 2.0.X 架設安裝上的問題,只要有安裝任何外掛,請到外掛討論相關版面按照公告格式發表。
(發表文章請按照公告格式發表,違者砍文)
主題已鎖定
Alvin.Hsin
星球普通子民
星球普通子民
文章: 10
註冊時間: 2007-11-17 15:29

[已解決] 論壇採 UTF-8 編碼後, 造成部分會員名稱末端出現亂碼?

文章 Alvin.Hsin »

誠心感謝兩位大大的回覆。
心靈捕手 寫:UTF-8 編碼, 一個中文字約佔 1~4 字元不等, 因此若原來帳號名稱過長, 則尾端容易出現亂碼;
若需要更改的帳號很多, 則可自行增加允許帳號設定的長度
除了如 SCR 所言, 調整資料庫欄位的值之外,
您還必須修改底下檔案:
includes/functions.php
includes/usercp_register.php
請問捕手大大,可否請您解說一下上述兩個必須修改的檔案意義為何,我已經更改資料庫的會員名稱資料型態 varchar(25) -> varchar(40),到目前為止,顯示的部份都正常,如果不修改上述的兩個檔案,會影響論壇運作嗎?

-- 心靈捕手留言 --
本主題分割自 http://phpbb-tw.net/phpbb/viewtopic.php?t=49850
最後由 Alvin.Hsin 於 2007-11-23 20:49 編輯,總共編輯了 1 次。
頭像
心靈捕手
默默耕耘的老師
默默耕耘的老師
文章: 8538
註冊時間: 2004-04-30 01:54
來自: Taiwan

Re: [問題][分享]將免空PHPBB2011(BIG5)->PHPBB2022(UTF-8)成功及一些疑問

文章 心靈捕手 »

Alvin.Hsin 寫:誠心感謝兩位大大的回覆。
心靈捕手 寫:UTF-8 編碼, 一個中文字約佔 1~4 字元不等, 因此若原來帳號名稱過長, 則尾端容易出現亂碼;
若需要更改的帳號很多, 則可自行增加允許帳號設定的長度
除了如 SCR 所言, 調整資料庫欄位的值之外,
您還必須修改底下檔案:
includes/functions.php
includes/usercp_register.php
請問捕手大大,可否請您解說一下上述兩個必須修改的檔案意義為何,我已經更改資料庫的會員名稱資料型態 varchar(25) -> varchar(40),到目前為止,顯示的部份都正常,如果不修改上述的兩個檔案,會影響論壇運作嗎?
建議您, 試試底下兩個動作:
1. 新增測試帳號, 如 '一二三四五六七八九十' 可以順利註冊嗎?
2. 測試一下, 這些修改過的帳號 如 '一二三四五六七八九' 可以順利登入嗎?
施比受有福,祝福您好運! ^_^
歡迎光臨★★心靈捕手★★ :: 討論區
https://wang5555.dnsfor.me/phpBB3/
Alvin.Hsin
星球普通子民
星球普通子民
文章: 10
註冊時間: 2007-11-17 15:29

Re: [問題][分享]將免空PHPBB2011(BIG5)->PHPBB2022(UTF-8)成功及一些疑問

文章 Alvin.Hsin »

心靈捕手 寫:
Alvin.Hsin 寫:誠心感謝兩位大大的回覆。
心靈捕手 寫:UTF-8 編碼, 一個中文字約佔 1~4 字元不等, 因此若原來帳號名稱過長, 則尾端容易出現亂碼;
若需要更改的帳號很多, 則可自行增加允許帳號設定的長度
除了如 SCR 所言, 調整資料庫欄位的值之外,
您還必須修改底下檔案:
includes/functions.php
includes/usercp_register.php
請問捕手大大,可否請您解說一下上述兩個必須修改的檔案意義為何,我已經更改資料庫的會員名稱資料型態 varchar(25) -> varchar(40),到目前為止,顯示的部份都正常,如果不修改上述的兩個檔案,會影響論壇運作嗎?
建議您, 試試底下兩個動作:
1. 新增測試帳號, 如 '一二三四五六七八九十' 可以順利註冊嗎?
2. 測試一下, 這些修改過的帳號 如 '一二三四五六七八九' 可以順利登入嗎?
我嘗試自行註冊了兩個帳號
一二三四五六七八
以及
一二三四五六七八九十
然後點選首頁的會員列表,前者的帳號顯示正常,後者的帳號卻顯示
一二三四五六七八伯a>
與文章上圖相同。
再來我就進入PHPBB後台,再 [會員管理] 的項目,使用 [搜尋會員名稱],利用*萬用字元搜尋,只有發現前者的帳號名稱,卻不見後者的帳號名稱。(前者登入正常,後者無法登入)

再來我就進入資料庫修改後者的帳號為 "一二三四五六七八九十",修改完之後,在資料庫顯示都正常,然後再回到首頁進入後台,同樣使用 [搜尋會員名稱],利用*萬用字元搜尋,兩者的帳號名稱都顯示正常,可是當我選擇後者帳號使用 [查詢會員] 之時,卻顯示 "您所選擇的會員名稱不存在",然後我在嘗試在首頁登入後者的帳號,卻也顯示 "您輸入了無效的登入名稱或錯誤的密碼"。

我又再另作測試,進入資料庫修改前者的帳號為 "一二三四五六七八九",修改完之後,在資料庫顯示都正常,然後再回到首頁進入後台,同樣使用 [搜尋會員名稱],利用*萬用字元搜尋,有顯示前者的帳號,可是當我選擇該帳號使用 [查詢會員] 之時,卻也顯示 "您所選擇的會員名稱不存在",同樣我在嘗試在首頁登入該帳號,卻也顯示 "您輸入了無效的登入名稱或錯誤的密碼"。

再來我又將兩者的帳號,從資料庫去修改名稱在少於8個中文字以內,再重複上述的步驟,幾乎完全正常了。

結論:
修改資料庫可以改善顯示不正常的問題,可是會員名稱超過8個中文字還是會有登入以及管理帳號上的問題。

請問捕手老師,我該如何修改下列兩個檔案
includes/functions.php
includes/usercp_register.php
我參考了 [神川小羽] 大大這篇文章 UTF-8化後對於字串長度的處理,卻看不出什麼頭緒可以修改的地方。

感謝捕手老師的指教...
頭像
心靈捕手
默默耕耘的老師
默默耕耘的老師
文章: 8538
註冊時間: 2004-04-30 01:54
來自: Taiwan

Re: [問題][分享]將免空PHPBB2011(BIG5)->PHPBB2022(UTF-8)成功及一些疑問

文章 心靈捕手 »

Alvin.Hsin 寫:結論:
修改資料庫可以改善顯示不正常的問題,可是會員名稱超過8個中文字還是會有登入以及管理帳號上的問題。

請問捕手老師,我該如何修改下列兩個檔案
includes/functions.php
includes/usercp_register.php
我參考了 [神川小羽] 大大這篇文章 UTF-8化後對於字串長度的處理,卻看不出什麼頭緒可以修改的地方。

感謝捕手老師的指教...
我的觀點只是源於昔日修改 '多國語言...' 的經驗.
http://phpbb-tw.net/phpbb/viewtopic.php?t=35623

您說的會員 '登入以及管理帳號上的問題' 通通和這個函式 phpbb_clean_username() 有關.

以下的修改, 提供您參考:
#
#-----[ OPEN ]-----
#
includes/functions.php

#
#-----[ FIND ]-----
#

代碼: 選擇全部

	$username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25);
#
#-----[ REPLACE WITH ]-----
# ps. **40** 只為配合您資料庫修改的數值
#

代碼: 選擇全部

	$username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 40);
#
#-----[ SAVE & CLOSE ]-----
#
至於 includes/usercp_register.php 的修改, 只為修正註冊後相關的通知信件,
其中的會員名稱顯示不正常而已. 如下:
#
#-----[ FIND ]-----
# ps. 類似的地方有5個, 全部取代
#

代碼: 選擇全部

0, 25
#
#-----[ REPLACE WITH ]-----
# ps. **40** 只為配合您資料庫修改的數值
#

代碼: 選擇全部

0, 40
--
若要參考 'UTF-8化後對於字串長度的處理' 修改,
則更為方便, 只要修改一個檔案即可, 就連資料庫也不必修改.
因為修改後, 輸入的會員名稱 (無論是中英文) 最多可以有25個字.

以下的修改, 提供您參考:
#
#-----[ OPEN ]-----
#
includes/functions.php

#
#-----[ FIND ]-----
#

代碼: 選擇全部

	$username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25);
#
#-----[ REPLACE WITH ]-----
#

代碼: 選擇全部

	$username = mb_substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25, 'utf-8');
#
#-----[ SAVE & CLOSE ]-----
#
施比受有福,祝福您好運! ^_^
歡迎光臨★★心靈捕手★★ :: 討論區
https://wang5555.dnsfor.me/phpBB3/
Alvin.Hsin
星球普通子民
星球普通子民
文章: 10
註冊時間: 2007-11-17 15:29

Re: [問題][分享]將免空PHPBB2011(BIG5)->PHPBB2022(UTF-8)成功及一些疑問

文章 Alvin.Hsin »

感謝捕手老師的指教...

我嘗試修改了下列兩種方式:
心靈捕手 寫:我的觀點只是源於昔日修改 '多國語言...' 的經驗.
http://phpbb-tw.net/phpbb/viewtopic.php?t=35623

您說的會員 '登入以及管理帳號上的問題' 通通和這個函式 phpbb_clean_username() 有關.

以下的修改, 提供您參考:
#
#-----[ OPEN ]-----
#
includes/functions.php

#
#-----[ FIND ]-----
#

代碼: 選擇全部

	$username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25);
#
#-----[ REPLACE WITH ]-----
# ps. **40** 只為配合您資料庫修改的數值
#

代碼: 選擇全部

	$username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 40);
#
#-----[ SAVE & CLOSE ]-----
#
至於 includes/usercp_register.php 的修改, 只為修正註冊後相關的通知信件,
其中的會員名稱顯示不正常而已. 如下:
#
#-----[ FIND ]-----
# ps. 類似的地方有5個, 全部取代
#

代碼: 選擇全部

0, 25
#
#-----[ REPLACE WITH ]-----
# ps. **40** 只為配合您資料庫修改的數值
#

代碼: 選擇全部

0, 40
這個方式,比較沒有什麼問題,從建立新的會員,名稱超過8個中文字,再登入或是管理會員的方面都很正常。

心靈捕手 寫: 若要參考 'UTF-8化後對於字串長度的處理' 修改,
則更為方便, 只要修改一個檔案即可, 就連資料庫也不必修改.
因為修改後, 輸入的會員名稱 (無論是中英文) 最多可以有25個字.

以下的修改, 提供您參考:
#
#-----[ OPEN ]-----
#
includes/functions.php

#
#-----[ FIND ]-----
#

代碼: 選擇全部

	$username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25);
#
#-----[ REPLACE WITH ]-----
#

代碼: 選擇全部

	$username = mb_substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25, 'utf-8');
#
#-----[ SAVE & CLOSE ]-----
#
但是這個方式,當我增加會員的時候,名稱同樣使用超過8個中文字,送出資料的時候卻出現了下列警告訊息...

代碼: 選擇全部

Warning: Wrong parameter count for substr() in /home/(帳號)/public_html/phpBB2/includes/functions.php on line 80

Warning: Cannot modify header information - headers already sent by (output started at /home/(帳號)/public_html/phpBB2/includes/functions.php:80) in /home/(帳號)/public_html/phpBB2/includes/page_header.php on line 483

Warning: Cannot modify header information - headers already sent by (output started at /home/(帳號)/public_html/phpBB2/includes/functions.php:80) in /home/(帳號)/public_html/phpBB2/includes/page_header.php on line 485

Warning: Cannot modify header information - headers already sent by (output started at /home/(帳號)/public_html/phpBB2/includes/functions.php:80) in /home/(帳號)/public_html/phpBB2/includes/page_header.php on line 486
但是我覺得捕手老師的這句話有點疑問?
心靈捕手 寫: 若要參考 'UTF-8化後對於字串長度的處理' 修改,
則更為方便, 只要修改一個檔案即可, 就連資料庫也不必修改.
如果說資料庫的會員名稱的資料型態不從 varchar(25) -> varchar(40) 的話,當會員名稱超過8個中文字,資料庫還的會員名稱是會顯示成亂碼不是嗎?

PS.我有看到jwxinst大大寫的這篇文章 [教學] 基本認識、學習、隨我架設phpBB的新手通(修訂中...)
內有敘述到:一個中文字用 BIG-5 儲存的話是 2bytes,換成 UTF-8 的話會變成 3bytes。
頭像
心靈捕手
默默耕耘的老師
默默耕耘的老師
文章: 8538
註冊時間: 2004-04-30 01:54
來自: Taiwan

Re: [問題][分享]將免空PHPBB2011(BIG5)->PHPBB2022(UTF-8)成功及一些疑問

文章 心靈捕手 »

Alvin.Hsin 寫:
心靈捕手 寫: 若要參考 'UTF-8化後對於字串長度的處理' 修改,
則更為方便, 只要修改一個檔案即可, 就連資料庫也不必修改.
因為修改後, 輸入的會員名稱 (無論是中英文) 最多可以有25個字.

以下的修改, 提供您參考:
#
#-----[ OPEN ]-----
#
includes/functions.php

#
#-----[ FIND ]-----
#

代碼: 選擇全部

	$username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25);
#
#-----[ REPLACE WITH ]-----
#

代碼: 選擇全部

	$username = mb_substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25, 'utf-8');
#
#-----[ SAVE & CLOSE ]-----
#
但是這個方式,當我增加會員的時候,名稱同樣使用超過8個中文字,送出資料的時候卻出現了下列警告訊息...

代碼: 選擇全部

Warning: Wrong parameter count for substr() in /home/(帳號)/public_html/phpBB2/includes/functions.php on line 80

Warning: Cannot modify header information - headers already sent by (output started at /home/(帳號)/public_html/phpBB2/includes/functions.php:80) in /home/(帳號)/public_html/phpBB2/includes/page_header.php on line 483

Warning: Cannot modify header information - headers already sent by (output started at /home/(帳號)/public_html/phpBB2/includes/functions.php:80) in /home/(帳號)/public_html/phpBB2/includes/page_header.php on line 485

Warning: Cannot modify header information - headers already sent by (output started at /home/(帳號)/public_html/phpBB2/includes/functions.php:80) in /home/(帳號)/public_html/phpBB2/includes/page_header.php on line 486
但是我覺得捕手老師的這句話有點疑問?
心靈捕手 寫: 若要參考 'UTF-8化後對於字串長度的處理' 修改,
則更為方便, 只要修改一個檔案即可, 就連資料庫也不必修改.
如果說資料庫的會員名稱的資料型態不從 varchar(25) -> varchar(40) 的話,當會員名稱超過8個中文字,資料庫還的會員名稱是會顯示成亂碼不是嗎?

PS.我有看到jwxinst大大寫的這篇文章 [教學] 基本認識、學習、隨我架設phpBB的新手通(修訂中...)
內有敘述到:一個中文字用 BIG-5 儲存的話是 2bytes,換成 UTF-8 的話會變成 3bytes。
我猜想:
要解決您的問題, 在 小羽 的文章中, 首尾多少都已經有提到.

代碼: 選擇全部

(以下修改請注意您必須有安裝 mbstring模組 安裝方法請點此處) 

代碼: 選擇全部

PS.這兩個函數對於英數字元 中文字元都是 1 所以您應該調整實際要取的長度(小一點或原來的一半左右)
也就是說, 這個修改, 需要您的系統啟用 mbstring 模組 ;
一旦啟用, 修改成功, 輸入的會員名稱 (無論是中英文) 最多可以有25個字.
Ex, 修改後, 底下三個會員名稱的長度都只是10.
一二三四五六七八九十
0123456789
abcdefghij

--
jwxinst 底下這句話有語病:

代碼: 選擇全部

一個中文字用 BIG-5 儲存的話是 2bytes,換成 UTF-8 的話會變成 3bytes。
因為 UTF-8 編碼是多位元編碼 (1~4 位元不等),
如上頭回文中, 我所提過的 'UTF-8 編碼, 一個中文字約佔 1~4 字元不等'.
所以說比較正確的說法, 應該是這樣:

代碼: 選擇全部

一個中文字用 BIG-5 儲存的話是 2bytes,換成 UTF-8 的話會變成 1~4bytes (常用漢字為 3bytes)。
--
ps.
後面的 '會員名稱長度' 討論, 比較屬於 'phpbb 使用' 範圍;
將適度分割成新主題後, 移動之.
施比受有福,祝福您好運! ^_^
歡迎光臨★★心靈捕手★★ :: 討論區
https://wang5555.dnsfor.me/phpBB3/
Alvin.Hsin
星球普通子民
星球普通子民
文章: 10
註冊時間: 2007-11-17 15:29

文章 Alvin.Hsin »

再次感謝捕手老師的指教。

目前會員名稱長度的問題已經解決了,但是我只是用了前者的修改方式,修改了下列兩個檔案:
includes/functions.php
includes/usercp_register.php

基於我使用的資料庫是免費空間的原因,所以沒辦法測試啟用 mbstring 模組的修改方式,也因為我最近沒有很充裕的時間在本機電腦安裝測試,期待有下一位的網友,測試分享經驗,造福竹貓大眾...
主題已鎖定

回到「phpBB 2 安裝與使用」