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 也可以使用編碼過濾器來解決,最常用的...