[討論] 關於去掉 BIG-5 轉 UTF-8 衝碼字的反斜線
版主: 版主管理群
版面規則
本區是討論關於 phpBB 2.0.X 架設安裝上的問題,只要有安裝任何外掛,請到外掛討論相關版面按照公告格式發表。
(發表文章請按照公告格式發表,違者砍文)
本區是討論關於 phpBB 2.0.X 架設安裝上的問題,只要有安裝任何外掛,請到外掛討論相關版面按照公告格式發表。
(發表文章請按照公告格式發表,違者砍文)
[討論] 關於去掉 BIG-5 轉 UTF-8 衝碼字的反斜線
前言說明:
----------------------------------------------------------
BIG-5 因為存在衝碼字的問題
PHP 在將許蓋功.....等衝碼字,存入資料庫時
會自動在後面加上反斜線:例如:許\\ 蓋\\ 功\\
當把資料庫匯出 (mysqldump)
使用轉碼軟體進行轉換後,這些「反斜線」也會被保留下來
由於匯出的資料庫單一檔案 .sql, 會保有 SQL 語法
SQL 語法中,規定字串必須用單引號 ' 框住
假設有一行內容剛好衝碼字是在結尾\r
就會變成這樣:成功\\'
而反斜線 \ 在 SQL 語法中有特殊意義,是脫逸字元
\' 代表忽略這個單引號,把單引號 ' 當字串處理
也就是說會變成字串不再被單引號 ' 框住
這在 SQL 語法中,是屬於錯誤語法
簡言之,當要匯入資料庫時,反斜線將會造成 SQL 語法錯誤,而無法匯入\r
爬文後,找到的解決的方法,大多是:
用文書編輯器開啟 .sql 檔進行「手動編輯」
來解決這個問題
手動去編輯高達幾萬行的純文字檔
雖然是累了點,總歸來說,還是有可能辦到\r
但是,有一個無法克服的問題是:
假如資料庫高達幾百 MB
根本沒有任何一款文書編輯器,能開啟這樣大的檔案!
開了電腦就當機了,完全無法操作 Orz
因此在下苦思其它解決之道,終於頓悟出一個方法.....
另類解決方法:
----------------------------------------------------------
convertZ 不只提供編碼轉換功能\r
它還能進行簡繁體轉換
更厲害的是有修正兩岸詞彙的功能\r
換句話說,convertZ 具有「取代字串」的功能\r
但這個功能,只能使用在簡繁互換,是比較麻煩的地方\r
需利用一些小技巧,也就是要轉兩次
先「繁體 → 簡體」,再「簡體→UTF-8(繁體)」
新增自訂詞彙表\r
自訂詞彙表,輸入衝碼字,將有反斜線的,全部轉成無反斜線
繁體 → 簡體,不進行詞彙修正取代,以增加轉換速率
進行實驗,建立一個文字檔,內容:許\\ 蓋\\ 功\\
第一次轉換,繁體 (BIG-5) → 簡體
由於不套用「詞彙修正取代」,此時反斜線仍然存在\r
第二次轉換,簡體 → UTF-8 (繁體)
此次套用「詞彙修正取代」
由預覽中可發現,反斜線已經被去掉了
且也已經轉成 UTF-8
-------------------------------------------------------------------------
不知道各位大大覺得這個方法如何?
但使用這個方法的前提是:
必須知道 BIG-5 到底存在哪些衝碼字,才能建立完整「詞彙轉換表」
以便進行字串取代,去掉反斜線
換言之,必須知道:
PHP 到底是會把哪些字,後面加上反斜線?
請問有大大知道這方面的資訊嗎,是否可提供一下
謝謝
----------------------------------------------------------
BIG-5 因為存在衝碼字的問題
PHP 在將許蓋功.....等衝碼字,存入資料庫時
會自動在後面加上反斜線:例如:許\\ 蓋\\ 功\\
當把資料庫匯出 (mysqldump)
使用轉碼軟體進行轉換後,這些「反斜線」也會被保留下來
由於匯出的資料庫單一檔案 .sql, 會保有 SQL 語法
SQL 語法中,規定字串必須用單引號 ' 框住
假設有一行內容剛好衝碼字是在結尾\r
就會變成這樣:成功\\'
而反斜線 \ 在 SQL 語法中有特殊意義,是脫逸字元
\' 代表忽略這個單引號,把單引號 ' 當字串處理
也就是說會變成字串不再被單引號 ' 框住
這在 SQL 語法中,是屬於錯誤語法
簡言之,當要匯入資料庫時,反斜線將會造成 SQL 語法錯誤,而無法匯入\r
爬文後,找到的解決的方法,大多是:
用文書編輯器開啟 .sql 檔進行「手動編輯」
來解決這個問題
手動去編輯高達幾萬行的純文字檔
雖然是累了點,總歸來說,還是有可能辦到\r
但是,有一個無法克服的問題是:
假如資料庫高達幾百 MB
根本沒有任何一款文書編輯器,能開啟這樣大的檔案!
開了電腦就當機了,完全無法操作 Orz
因此在下苦思其它解決之道,終於頓悟出一個方法.....
另類解決方法:
----------------------------------------------------------
convertZ 不只提供編碼轉換功能\r
它還能進行簡繁體轉換
更厲害的是有修正兩岸詞彙的功能\r
換句話說,convertZ 具有「取代字串」的功能\r
但這個功能,只能使用在簡繁互換,是比較麻煩的地方\r
需利用一些小技巧,也就是要轉兩次
先「繁體 → 簡體」,再「簡體→UTF-8(繁體)」
新增自訂詞彙表\r
自訂詞彙表,輸入衝碼字,將有反斜線的,全部轉成無反斜線
繁體 → 簡體,不進行詞彙修正取代,以增加轉換速率
進行實驗,建立一個文字檔,內容:許\\ 蓋\\ 功\\
第一次轉換,繁體 (BIG-5) → 簡體
由於不套用「詞彙修正取代」,此時反斜線仍然存在\r
第二次轉換,簡體 → UTF-8 (繁體)
此次套用「詞彙修正取代」
由預覽中可發現,反斜線已經被去掉了
且也已經轉成 UTF-8
-------------------------------------------------------------------------
不知道各位大大覺得這個方法如何?
但使用這個方法的前提是:
必須知道 BIG-5 到底存在哪些衝碼字,才能建立完整「詞彙轉換表」
以便進行字串取代,去掉反斜線
換言之,必須知道:
PHP 到底是會把哪些字,後面加上反斜線?
請問有大大知道這方面的資訊嗎,是否可提供一下
謝謝
就我目前掌握的衝碼文字,跟我實際手動比對出的結果,我能夠過濾出的就是這些
像有些文字不是用不到,就是會偽裝成"\\\"符號,或者是遇到特殊的字碼會被判讀成中日韓的專用字 (如:蔌\\ 變成 \\)
我也希望大家能夠幫忙過濾出能夠放心更換的"絕對字碼"(如:許\\ 功\\ 蓋\\)就算交由程式自動修改也不怕改錯\r
像有些文字不是用不到,就是會偽裝成"\\\"符號,或者是遇到特殊的字碼會被判讀成中日韓的專用字 (如:蔌\\ 變成 \\)
我也希望大家能夠幫忙過濾出能夠放心更換的"絕對字碼"(如:許\\ 功\\ 蓋\\)就算交由程式自動修改也不怕改錯\r
么\\
功\\
吒\\
吭\\\r
沔\\
坼\\ \\\
歿\\\r
俞\\
枯\\\r
苒\\
娉\\
珮\\\r
豹\\\r
崤\\ \\\
淚\\
許\\\r
廄\\
琵\\\r
跚\\
愧\\\r
稞\\ \\\
鈾\\ \\\
暝\\ \\\
蓋\\
墦\\\r
穀\\
閱\\\r
璞\\
餐\\
縷\\\r
擺\\\r
黠\\
孀\\ 踊\\
髏\\
躡\\ \\\
尐\\
佢\\\r
汻\\\r
岤\\\r
狖\\
垥\\ \\\
柦\\ \\\
胐\\
娖\\
涂\\
罡\\ \\\
偅\\
惝\\ \\\
牾\\\r
莍\\\\r
傜\\
揊\\ \\\
焮\\\r
茻\\\r
鄃\\ \\\
幋\\
滜\\
綅\\
赨\\ 餐\\
塿\\ 縷\\\r
槙\\ 擺\\\r
箤\\\r
踊\\ 孀\\
嫹\\ 髏\\
潿\\ \\\
蔌\\ \\\r
醆\\
嬞\\
獦\\ 佢\\\r
螏\\
餤\\\r
燡\\\r
螰\\ \\\
駹\\ \\\
礒\\
鎪\\\r
瀙\\ 涂\\
酀\\ \\\
瀵\\\r
騱\\ \\\
酅\\
贕\\
鱋\\
鱭\\ \\\
我有測試過,結果是失敗.... Orz
匯入資料庫時仍然出現錯誤訊息\r
這個方法理論上是行的通的
估計是「詞彙轉換表」還不夠完整\r
有些反斜線遺漏到,沒有完全轉換到\r
不過我的資料庫是因為屬於比較大的,約400多MB
內涵字詞太多,所以需要完整的「詞彙轉換表」
資料庫沒那麼大的網友,不妨試試,說不定可以成功
附上具體操作方法:
有興趣的朋友,不妨試試看,說不定可以成功
匯入資料庫時仍然出現錯誤訊息\r
這個方法理論上是行的通的
估計是「詞彙轉換表」還不夠完整\r
有些反斜線遺漏到,沒有完全轉換到\r
不過我的資料庫是因為屬於比較大的,約400多MB
內涵字詞太多,所以需要完整的「詞彙轉換表」
資料庫沒那麼大的網友,不妨試試,說不定可以成功
附上具體操作方法:
以上就是具體操作方法convertZ 下載點 (免費軟體):
http://alf-li.pcdiscuss.com/
MySQL 的操作指令\r
windows 下可在 c:\AppServ\mysql\bin 中找到\r
Linux 下,直接打指令即可\r
假設資料庫的名稱叫做:phpbb
註:在操作以下方法時,請先備份資料庫,或者拷貝到實驗環境進行測試。
1.導出資料庫\r
指令:mysqldump -u root -p --opt phpbb > phpbb.sql
(phpbb 是資料庫的名稱)
要求輸入密碼:輸入 MySQL 管理員的密碼\r
然後就會得到一個檔案: phpbb.sql
這個檔案就是導出的資料庫\r
是純文字檔,如果不是太大,可用文書編輯器開啟
可以看到裡頭是 SQL 語法
2.使用 convertZ 對 phpbb.sql 那個檔進行轉換
轉換方法如上面第一帖所述,請參考第一帖的圖片
簡→繁,「詞彙轉換表」的部份
請參考樓上大大們提供的資料,自行建立
3.將轉換好的 phpbb.sql 匯入資料庫\r
殺掉原先的資料庫,直接砍掉目錄即可\r
(請先確定已經備份)
創建一個同名的空資料庫 (假設是 phpbb)
指令:mysqladmin -u root -p create phpbb
密碼:輸入 mysql 管理員密碼\r
匯入資料表\r
指令:mysql -u root -p phpbb < phpbb.sql
密碼:輸入 mysql 管理員密碼\r
如果前面第2個轉換步驟,有完全取代衝碼字的話\r
此時應該就可以正確匯入\r
匯入後,資料庫就是 UTF-8 的了!
假如匯入到一半出現錯誤訊息\r
就是仍存在衝碼字的反斜線問題,無法匯入....殘念\r
有興趣的朋友,不妨試試看,說不定可以成功
我的資料庫沒有你那麼大,大約 160 MB 左右。linux_xp 寫:這個方法理論上是行的通的
估計是「詞彙轉換表」還不夠完整\r
有些反斜線遺漏到,沒有完全轉換到\r
不過我的資料庫是因為屬於比較大的,約400多MB
內涵字詞太多,所以需要完整的「詞彙轉換表」
資料庫沒那麼大的網友,不妨試試,說不定可以成功
幾個月前將 BIG5 轉 UTF-8 時也是遇到像你這樣的情況。
不過當時還沒有人整理所謂的「詞彙轉換表」。
我也是很辛苦的花了很多時間將有反斜線的字元整理出來並且修正後,才順利的將 UTF-8 化的資料庫內容還原回去。
你整理的資料的確很有用,希望能夠幫助到更多的網友。
有任何關於 phpBB 或是架站的問題,請在論壇上公開發表出來,大家一起討論。
請不要丟私人訊息問我,因為私訊是用來聊私事的。
這樣作對於解決您的問題一點幫助也沒有,也很沒有效率,小弟我一概謝絕。
搜尋是一種美德,在發問之前,請多加利用頂端的文章搜尋功能,搜尋可能的關鍵字。
確定您想問的問題找不到答案後,再發問。
請不要丟私人訊息問我,因為私訊是用來聊私事的。
這樣作對於解決您的問題一點幫助也沒有,也很沒有效率,小弟我一概謝絕。
搜尋是一種美德,在發問之前,請多加利用頂端的文章搜尋功能,搜尋可能的關鍵字。
確定您想問的問題找不到答案後,再發問。
下面是我經過手動將兩三個網站轉碼出來比對的結果 (中日編碼)
有些是資料庫找不到的,有些則是在手動搜尋當中會判讀成\\\符號.我一併做記錄你們讓做參考
有些是資料庫找不到的,有些則是在手動搜尋當中會判讀成\\\符號.我一併做記錄你們讓做參考
PS. 上面註解*代表可修改,如有*和\\\並存,代表需要手動過濾么\\ *
功\\ *
吒\\ *
吭\\ *
沔\\
坼\\ \\\
歿\\\r
俞\\ * \\\
枯\\ *
苒\\ *
娉\\ *
珮\\ *
豹\\ * \\\
崤\\ \\\
淚\\ *
許\\ *
廄\\ *
琵\\ *
跚\\ *
愧\\ *
稞\\ \\\
鈾\\ \\\
暝\\ * \\\
蓋\\ *
墦\\ \\\
穀\\\ *
閱\\ *
璞\\ *
餐\\ *
縷\\ *
擺\\ *
黠\\ *
孀\\ * 踊\\ \\\
髏\\ *
躡\\ * \\\
尐\\ *
佢\\ * \\\
汻\\ \\\
岤\\\r
狖\\
垥\\ \\\
柦\\ \\\
胐\\
娖\\
涂\\ * \\\
罡\\ * \\\
偅\\
惝\\ \\\
牾\\ \\\
莍\\
傜\\
揊\\ \\\
焮\\\r
茻\\\r
鄃\\ \\\
幋\\
滜\\
綅\\ \\\
赨\\ 餐\\
塿\\ 縷\\\r
槙\\ 擺\\\r
箤\\\r
踊\\ 孀\\
嫹\\ 髏\\
潿\\ \\\
蔌\\ \\\r
醆\\
嬞\\
獦\\ 佢\\\r
螏\\
餤\\\r
燡\\\r
螰\\ \\\
駹\\ \\\
礒\\
鎪\\\r
瀙\\ 涂\\
酀\\ \\\
瀵\\\r
騱\\ \\\
酅\\ \\\
贕\\
鱋\\
鱭\\ \\\
再轉竹貓資料庫的時候,我寫了這支函數,在還原的時候可以不用去挑出衝碼字後面的\
就可以還原,有興趣的可以嘗試看看,搭配超好用還原外掛讓你有意想不到的驚奇感受 (好熟的台詞...
不過用這種方式還原的話,就跟上面這篇文章一樣原本是3斜線(資料庫中)
會換成4條(資料庫中),如果是2條則沒有改變(資料庫中)1條的話就去除這一條(資料庫中)
另外用這方式轉的仍然逃不過\\rr的魔爪,如果覺得有礙觀瞻的話就修改viewtopic.php把
\\rr藏起來,一行程式碼應該是沒啥大礙,只要是打\\rr比較麻煩就是了。
就可以還原,有興趣的可以嘗試看看,搭配超好用還原外掛讓你有意想不到的驚奇感受 (好熟的台詞...
代碼: 選擇全部
function abc123($text)
{
$text = str_replace('\\rr','[=r=r=r=r=r=]',$text);
$text = str_replace('\n','[=n=n=n=n=n=]',$text);
$text = explode('\\',$text);
$ok = '';
for($i=0; $i<count($text); $i++)
{
$ok .= $text[$i];
if( $text[$i] == '' )
{
$ok .= '\\\\';
}
}
$ok = str_replace('[=r=r=r=r=r=]','\\rr',$ok);
$ok = str_replace('[=n=n=n=n=n=]','\n',$ok);
return $ok;
}
會換成4條(資料庫中),如果是2條則沒有改變(資料庫中)1條的話就去除這一條(資料庫中)
另外用這方式轉的仍然逃不過\\rr的魔爪,如果覺得有礙觀瞻的話就修改viewtopic.php把
\\rr藏起來,一行程式碼應該是沒啥大礙,只要是打\\rr比較麻煩就是了。
-.-
小弟想到一個十分簡單的方法,不知道行不行的通:
如下所述的:
並且把所有的 \\' 取代為 '
既然是在結尾的地方,那麼真正會在結尾還會用到\\的機會應該少之又少
舉例:
INSERT INTO `newstitle` VALUES (1, '羅德2005年選秀', 'http://npb.club.tw/viewtopic.php?t=17181', '小許\\', 'images/flags/1.gif');
INSERT INTO `newstitle` VALUES (2, '廣島的「球犬」米奇初次登場', 'http://npb.club.tw/viewtopic.php?t=17389', '三井康雄', 'images/flags/7.gif');
INSERT INTO `newstitle` VALUES (3, '達比修的禁足即將解除~發表"生涯三禁"!!!', 'http://npb.club.tw/viewtopic.php?t=17382', '清原 利家', 'images/flags/6.gif');
INSERT INTO `newstitle` VALUES (4, '小笠原與新庄的啤酒廣告', 'http://npb.club.tw/viewtopic.php?t=16808', 'michihiro0620', 'images/flags/6.gif');
INSERT INTO `newstitle` VALUES (5, '2005中日選秀專區', 'http://npb.club.tw/viewtopic.php?t=17124', 'oberon', 'images/flags/11.gif');
INSERT INTO `newstitle` VALUES (6, '想為樂天加油(對樂天的期許\\', 'http://npb.club.tw/viewtopic.php?t=17416', 'LYF', 'images/flags/14.gif');
在上面的sql指令裡有兩個許字剛好在單引號前面,所以SQL匯出的時候在前面加上了雙斜線,我們只要把單引號前面有雙斜線的如『(對樂天的期許\\'』取代成為單引號,自然可以解決這問題。不知道我說的大家是否瞭解,我沒有真的試過。
如下所述的:
那麼我們把轉出來的sql檔打開假設有一行內容剛好衝碼字是在結尾
就會變成這樣:成功\\'
並且把所有的 \\' 取代為 '
既然是在結尾的地方,那麼真正會在結尾還會用到\\的機會應該少之又少
舉例:
INSERT INTO `newstitle` VALUES (1, '羅德2005年選秀', 'http://npb.club.tw/viewtopic.php?t=17181', '小許\\', 'images/flags/1.gif');
INSERT INTO `newstitle` VALUES (2, '廣島的「球犬」米奇初次登場', 'http://npb.club.tw/viewtopic.php?t=17389', '三井康雄', 'images/flags/7.gif');
INSERT INTO `newstitle` VALUES (3, '達比修的禁足即將解除~發表"生涯三禁"!!!', 'http://npb.club.tw/viewtopic.php?t=17382', '清原 利家', 'images/flags/6.gif');
INSERT INTO `newstitle` VALUES (4, '小笠原與新庄的啤酒廣告', 'http://npb.club.tw/viewtopic.php?t=16808', 'michihiro0620', 'images/flags/6.gif');
INSERT INTO `newstitle` VALUES (5, '2005中日選秀專區', 'http://npb.club.tw/viewtopic.php?t=17124', 'oberon', 'images/flags/11.gif');
INSERT INTO `newstitle` VALUES (6, '想為樂天加油(對樂天的期許\\', 'http://npb.club.tw/viewtopic.php?t=17416', 'LYF', 'images/flags/14.gif');
在上面的sql指令裡有兩個許字剛好在單引號前面,所以SQL匯出的時候在前面加上了雙斜線,我們只要把單引號前面有雙斜線的如『(對樂天的期許\\'』取代成為單引號,自然可以解決這問題。不知道我說的大家是否瞭解,我沒有真的試過。
只要資料量小的話,其實都很好解決也輕鬆,至於一平提到的方式只能應用在big5的情況下
當轉到utf-8後,所有衝碼字後面的\都要去掉,舉例
INSERT INTO `newstitle` VALUES (1, '也許\是這樣秀', 'http://npb.club.tw/viewtopic.php?t=17181', '123', 'images/flags/1.gif');
在big5這樣是沒關係的,在utf-8的情況下就不行,用UltraEdit-32應該是不錯的選擇
不過SQL檔案很大的時候,你的電腦應該要夠力..,EE的話200MB開是還可以啦
不過搜尋取代仍然是很吃力。而資料量大也表示衝碼字一定相當多,其實衝碼字是很多的...
當轉到utf-8後,所有衝碼字後面的\都要去掉,舉例
INSERT INTO `newstitle` VALUES (1, '也許\是這樣秀', 'http://npb.club.tw/viewtopic.php?t=17181', '123', 'images/flags/1.gif');
在big5這樣是沒關係的,在utf-8的情況下就不行,用UltraEdit-32應該是不錯的選擇
不過SQL檔案很大的時候,你的電腦應該要夠力..,EE的話200MB開是還可以啦
不過搜尋取代仍然是很吃力。而資料量大也表示衝碼字一定相當多,其實衝碼字是很多的...
-.-
小弟想請教:神川小羽 寫:再轉竹貓資料庫的時候,我寫了這支函數,在還原的時候可以不用去挑出衝碼字後面的\
就可以還原,有興趣的可以嘗試看看,搭配超好用還原外掛讓你有意想不到的驚奇感受 (好熟的台詞...不過用這種方式還原的話,就跟上面這篇文章一樣原本是3斜線(資料庫中)代碼: 選擇全部
function abc123($text) { $text = str_replace('\\rr','[=r=r=r=r=r=]',$text); $text = str_replace('\n','[=n=n=n=n=n=]',$text); $text = explode('\\',$text); $ok = ''; for($i=0; $i<count($text); $i++) { $ok .= $text[$i]; if( $text[$i] == '' ) { $ok .= '\\\\'; } } $ok = str_replace('[=r=r=r=r=r=]','\\rr',$ok); $ok = str_replace('[=n=n=n=n=n=]','\n',$ok); return $ok; }
會換成4條(資料庫中),如果是2條則沒有改變(資料庫中)1條的話就去除這一條(資料庫中)
另外用這方式轉的仍然逃不過\\rr的魔爪,如果覺得有礙觀瞻的話就修改viewtopic.php把
\\rr藏起來,一行程式碼應該是沒啥大礙,只要是打\\rr比較麻煩就是了。
神川小羽前輩所指的超好用還原外掛,是否就是 restore_dump.php或另一種類似的bigdump.php?
如果是的話,不知道以上函數要如何與這些還原外掛搭配使用?請前輩們給予指導,非常感謝!
eCosway為您的人生增添光彩
歡迎參觀我的網站:http://www.doecosway.com/tw063252
歡迎參觀我的網站:http://www.doecosway.com/tw063252