【說明】
關於中文顯示範圍太廣泛,但網路資源太過分散,導致許多問題明明有解答,卻無法被找出,以下為各位整理出完整的中文顯示修復教學,請注意,參考資料僅參考,本教學內容之方法會跟參考資料有出入,自行斟酌使用。

【準備】
此教學會動到的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  作者 : 薯餅

【最後整理】AICL集團卡納谷管理團隊



{ 4 留言... read them below or Comment }

  1. 這getlength會有全形特殊符號無法處理問題

    回覆刪除
    回覆
    1. 如果有更好的修正辦法,很歡迎分享喔!!!

      刪除
    2. 這只能顯示,要能輸入要改主程序

      刪除

- Copyright © AICL社群娛樂集團 - 網站區 - Date A Live - Powered by Blogger - Designed by Johanes Djogan -