2017年11月10日 星期五

Robi 技術研究・五


要開發編輯器,得先讓程式讀懂 RM4 檔案內容,變成一個個物件,方便重新組合及排列。

於是,我著手解析 RM4 內的結構,自行編寫匯入程式;可是,這不是件容易的工作,有很多不同的處理。像是如 medit 般有開始的標籤,也有完結的標籤;像 return 是一句都尾;像 block 是有很多不同的參數;要準確讀取,得下很多功夫。於是我在想,PHP 應該有現成的功能去處理自訂 XML,結果找到 xml_parse_into_struct()。

我把 RM4 內容直接拋給 xml_parse_into_struct(),結果只有第一個 medit 發其內在句子能解讀成功。估計是因為程序把 XML 內第一個標籤當為根,當同一個標籤完結時,程序便會結束。於是的為 RM4 內容外圍包一層 <robi></robi>,結果能解讀出更多內容。不過,還算不上是成功;因為結果中出現很多不知明的部份,而程序也只能解讀到包含日文字參數為止;即是上圖中的「立ち状態?」。研究過後,那些不知明的部份是用 \r\n 引發,於是利用 str_replace() 把它們清除。至於日文字參數方面,則用 mb_convert_encoding() 把原本為 Shift-JIS 的日文編碼轉換為 UTF-8 無國籍碼,問題便得到解決。可是,還是遇到新的問題,程序還未能完整解讀 RM4 內容。追查之下,發現有參數的數值內容包含 << 及 >>,導致 XML 解讀失敗。今次我同樣用 str_replace() 把它們清除。最後,能成功解讀了。

沒有留言: