MANGOS中文問題最懶解決方案

2021-08-22 12:22:36 字數 2520 閱讀 8947

mangos的程式架構沒有考慮多語種支援,給我們帶來了不少麻煩~

目前的做法:

漢化原始碼->記事本轉存utf-8->字串首尾加空格(utf-8格式儲存)->vs2003編譯->中文完美顯示

此方法只適用於vs2003 (vs2005中文無法完整顯示),操作繁瑣,轉化後的原始碼不直觀不便修改...

本人對c++不太熟,經過一段時間摸索,找到了乙個解決此問題的方法,而且對已完成的漢化內容不用做任何修改即可生效,暫且叫最懶解決方案吧 --__--|||

我發現mangos向客戶端傳送文字的都是utf-8編碼的,經過除錯發現vs2005編譯後的原始碼在傳送前就已經存在問題了,也就是說用vs2005編譯的含有外部工具轉換後的utf-8編碼的中文字元的原始碼並不能保證中文部分的完整性,具體內在原因我沒有再深入查下去...就算查下去也不太可能修改vs2005的編譯方式~~~

驗證此問題可用如下**:

cpp **

#include "stdafx.h"

#include

#include

#include

using namespace std;

void utf_8tounicode(wchar_t* pout,char *ptext)   

void unicodetoutf_8(char* pout,wchar_t* ptext)   

void unicodetogb2312(char* pout,wchar_t udata)   

void gb2312tounicode(wchar_t* pout,char *gbbuffer)   

void gb2312toutf_8(string& pout,char *ptext, int plen)   

else

}   

rst[j] = '\0';   

pout = rst;   

delete rst;   

return;   

}   

void utf_8togb2312(string &pout, char *ptext, int plen)   

else

}   

newbuf[j] = '\0';   

pout = newbuf;   

delete newbuf;   

return;   

}   

int _tmain(int argc, _tchar* argv)   

vs2005編譯後 test 2 的輸出結果並不是「管理員」 --__--|||

問題找到了,接下來就是解決問題,既然vs2005不能完美編譯預先轉換後的中文原始碼,那就改寫這部分的處理方式即可。

順著這條思路我找到了gossipdef.cpp的void playermenu::sendgossipmenu( uint32 titletextid, uint64 npcguid)方法,這是mangos服務端向客戶端輸出對話介面的最終出口,在這裡做一些改寫即可達到目的,改寫後的**如下:

----------------------------------------

cpp **

...   

void playermenu::sendgossipmenu( uint32 titletextid, uint64 npcguid )   

data << str;   

// <<< tyre

data << uint8(0);   

}   

data << uint32( pquestmenu->menuitemcount() );   

for ( uint16 ii = 0; ii < pquestmenu->menuitemcount(); ii++ )   

}   

data << title;   

}   

psession->sendpacket( &data );   

}   

...  

大家可能注意到了

if(str[0] == ' '){ // 根據首字元是否為空格來判斷是否需要轉換

因為playermenu::sendgossipmenu是處理原始碼與資料庫中資料的統一出口,對於原本就是utf-8編碼的資料不能進行再次轉換,不然會產生亂碼。為了便於區分加上根據之前的習慣,漢化後的字串前後都已經加上了空格,根據這一特點決定了用此方式來區分是否需要轉換,也可以換種方式加上字串編碼分析然後再做區分判斷(可擴充套件為多語種支援),暫時不搞了,以後再說吧~

此方式通過擴充套件是可以支援多語種的,但是將內容文字hardcode進原始碼的味道很不好~,還是等待mangos團隊對**做整體更新吧,另外mangos的文字輸出介面可能不只這乙個playermenu::sendgossipmenu,等發現了其它介面用同樣方法修改即可。。。

總結最懶解決方案:

漢化原始碼->字串首加空格(gb2312/utf-8格式儲存)->vs2003/2005編譯->中文完美顯示

不知道mangos是什麼? 去這裡看看就知道了

解決EJB懶載入問題

對於ejb懶載入時,由於沒有hibernate中的opensessionview,那麼需要在會話結束之前就載入資料,可以選擇在dao層實現,如下 public tbldeliverywarrant find1 string id throws serviceexception deliverywar...

Get,Post請求中文亂碼問題有效解決方法

本文主要介紹如何有效解決web請求中的亂碼問題,其實解決方法有很多種,不同的請求型別解決方法也不相同。1 針對post方式提交的請求如果出現亂碼,可以每次在request解析資料時設定編碼格式 request.setcharacterencoding utf 8 也可以使用編碼過濾器來解決,最常用的...

Get,Post請求中文亂碼問題有效解決方法

本文主要介紹如何有效解決web請求中的亂碼問題,其實解決方法有很多種,不同的請求型別解決方法也不相同。1 針對post方式提交的請求如果出現亂碼,可以每次在request解析資料時設定編碼格式 request.setcharacterencoding utf 8 也可以使用編碼過濾器來解決,最常用的...