本帖最後由 t9540513 於 2022-11-8 09:35 編輯
【說明】 關於中文顯示範圍太廣泛,但網路資源太過分散,導致許多問題明明有解答,卻無法被找出, 以下為各位整理出完整的中文顯示修復教學,請注意,參考資料僅參考, 本教學內容之方法會跟參考資料有出入,自行斟酌使用。
如果是 TMS 版本可以不用看。 這是GMS62 適用的,其他高版本非TMS就當觀念看一看。
【準備】 此教學會動到的JAVA如下,請先使用您的編譯軟件開好以下JAVA GenericLittleEndianWriter.JAVA LittleEndianAccessor.JAVA StringUtil.java MaplePacketCreator.java
【解決問題】 1.中文顯示NPC、中文名稱、端口支援中文 2.中文聊天顯示 ( 非中文發話 )
【教學開始】 #中文顯示NPC、中文名稱、端口支援中文
打開 GenericLittleEndianWriter.JAVA 搜尋 private static Charset ASCII = Charset.forName("US-ASCII");
改成
public class GenericLittleEndianWriter implements LittleEndianWriter { private static Charset ASCII = Charset.forName("BIG5");
private ByteOutputStream bos;
|
同個JAVA搜尋 writeShort((short) s.length());改成
riteShort((short)getlength(s));
|
打開 StringUtil.java搜尋 public static String getRightPaddedStr(String in, char padchar, int length) {改成
public static int getlength(String str){ int i,t=0; byte[] bt = str.getBytes(); for(i=1;i<=bt.length;i++){ if (bt[i-1]<0) {t=t+2;i++;} else t=t+1; } return t; } public static String getRightPaddedStr(String in, char padchar, int length) { StringBuilder builder = new StringBuilder(in); for (int x = getlength(in); x < length; x++) {
|
打開 MaplePacketCreator.java搜尋 private static void addCharStats(MaplePacketLittleEndianWriter mplew, MapleCharacter chr) {在他上面加上
public static int getlength(String str){ int i,t=0; byte[] bt = str.getBytes(); for (i=1;i<=bt.length;i++){ if (bt[i-1]<0) {t=t+2;i++;} else t=t+1; } return t; }
|
同個JAVA搜尋 for (int x = chr.getName().length(); x < 13; x++) {改成
for (int x = getlength(chr.getName()); x < 13; x++) {
|
接著將資料表 characters 設計資料表將編碼改成BIG5#中文聊天顯示 ( 非中文發話 )打開 GenericLittleEndianWriter.JAVA搜尋 writeAsciiString改成
public final void writeAsciiString(final String s) { write(s.getBytes(ASCII)); }
public final void writeAsciiString(String s, final int max) { if (s.getBytes(ASCII).length > max) { s = s.substring(0, max); } write(s.getBytes(ASCII)); for (int i = s.getBytes(ASCII).length; i < max; i++) { write((byte) 0); } }
public final void writeMapleAsciiString(final String s) { writeShort((short) s.getBytes(ASCII).length); writeAsciiString(s); }
|
打開 LittleEndianAccessor.JAVA搜尋 readAsciiString改成
public final String readAsciiString(final int n) { try { final byte ret[] = new byte[n]; for (int x = 0; x < n; x++) { ret[x] = readByte(); } return new String(ret, "big5"); } catch (UnsupportedEncodingException ex) { System.err.println(ex); } return "";
}
|
【文章參考】 淺談中文顯示 作者 : 相信是一種賭注 中文亂碼問題 作者 : 冷霜孤月 中文名稱、中文顯示NPC 作者 : 薯餅
|