2024年12月22日 星期日

Python: codecs read UnicodeDecodeError

2024年12月22日 星期日

 HTML5 FUN 的遊戲與工具大多是使用 LimeJS 開發的,LimeJS 其實已經停更快十年,連它依存的 Google Closure Library 也在 2024年8月封存。LimeJS 使用的 Closure Library 、Closure Compiler ...... 其實都是很舊的版本;像 compiler 最後是停在  20130411 的版本,這個舊版本,很多 JavaScript 新的語法它都不認得,當然,應該也存在不少臭蟲。

這幾天在測試,到底 LimeJS 在動得最少的狀況,Closure Library 和 Closure Compiler 可以使用到哪個較新一點的版本?都測試完以後,想讓 LimeJS 至少可以「活過來」,它目前下載原始專案的檔案,連安裝都會失敗。

以 Closure Library 來說,20170816 的版本是可以用的,但是它 build 工具 source.py (closure/bin/build/source.py) 遇到某些檔案會出現錯誤而卡住:

[圖1] Python codecs 讀取檔案失敗

上面最重要的訊息是:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 3457: invalid start byte

查了一下後來版本 Closure Library 的 source.py 中,用 codecs 來讀取檔案內容,而且指定使用「utf-8-sig」的編碼:

  fileobj = None
  try:
    fileobj = codecs.open(path, encoding='utf-8-sig')
    return fileobj.read()
  except IOError as error:
    err = True
    raise IOError('An error occurred opening or reading the file: %s. %s'
                  % (path, error))
  finally:
    if fileobj is not None:
      fileobj.close()

查了半天,總算知道卡住的原因了。哈!就那麼巧,我的檔案中居然有好幾個是使用 big5 中文編碼的。Python 的 codecs ,一執行到 read 就出現錯誤,這個情形在舊版使用內建的 open 再 read ,並不會生的。

解決這個錯誤的方法很簡單,就是先在程式中,先顯示檔名,然後就可以知道卡在哪一個檔案,將有問題的檔案以文字編輯器以 UTF-8 編碼來儲存即可。

有時真的不能太僵化,一開始我都懷疑是 Python 環境的問題,但是這一次是各種版本及系統都會發生,完全找錯方向了。

等都弄好以後,再將 LimeJS fork 一份並更新,實在怕哪一天什麼都沒有了,然後 HTML5 FUN 也跟著動不了了。

相關文章

沒有留言:

張貼留言

 
雄::gsyan © 2009. Design by Pocket