1. 程式人生 > >Sublime text 2/3 [Decode error

Sublime text 2/3 [Decode error

sublime text有時執行會輸出以下錯誤資訊:

[Decode error - output not utf-8]或者[Decode error - output not gbk]

錯誤資訊意思就是指令碼輸出的資訊不是某種指定編碼.

指定的編碼一般在XX.sublime-build裡,比如ruby.sublime-build的內容為: 

  1. {  
  2.     "shell_cmd""ruby \"$file\"",  
  3.     "file_regex""(\\w:...*?):([0-9]*):?([0-9]*)",  
  4.     "selector""source.ruby"
    ,  
  5.     "encoding""utf-8",   
  6. }  

其中encoding就是指定的編碼,ruby.sublime-build可以在Sublime Text 3\Packages\Ruby.sublime-package裡找到.

我們可以通過修改ruby.sublime-build來修改輸出文字資訊的編碼.

1. 將ruby.sublime-build檔案從Ruby.sublime-package裡複製出來,(注意:Ruby.sublime-package是一個zip壓縮檔案,只要將其後綴名改為zip即可開啟這個壓縮檔案)

2.將ruby.sublime-build複製到sublime text的Data\Packages\User\目錄

3. 開啟此檔案,將此檔案中的"encoding": "utf-8"修改為"encoding": "gbk"

以上這種修改有侷限,比如我有時候輸出的是utf-8,有時候輸出的是gbk,這時候就不行了.

以下方法可以解決這個侷限.

1.在sublime text的安裝目錄下的Packages\目錄下找到Default.sublime-package,將這個複製出來,將字尾改名為zip.

是的,它就是個zip檔案,解壓縮它,然後將其中的exec.py檔案放到sublime text的Data\Packages\User\目錄下.

2.開啟exec.py.找到類ExecCommand的append_data函式,在以下位置新增程式碼

  1. def append_data(self, proc, data):  
  2.      if proc != self.proc:  
  3.          # a second call to exec has been made before the first one
  4.          # finished, ignore it instead of intermingling the output.
  5.          if proc:  
  6.              proc.kill()  
  7.          return
  8.      #add start
  9.      is_decode_ok = True;  
  10.      try:  
  11.          str = data.decode(self.encoding)  
  12.      except:  
  13.          is_decode_ok = False
  14.      if is_decode_ok==False:  
  15.          try:  
  16.              str = data.decode("gbk")  
  17.          except:  
  18.              str = "[Decode error - output not " + self.encoding + " and gbk]\n"
  19.              proc = None
  20. add end  
  21.      # Normalize newlines, Sublime Text always uses a single \n separator
  22.      # in memory.
  23.      str = str.replace('\r\n''\n').replace('\r''\n')  
  24.      self.output_view.run_command('append', {'characters': str, 'force'True'scroll_to_end'True})  


其原理就是在解碼輸出文字編碼出錯時再使用gbk試試,相當於utf-8和gbk兩種編碼都試試,這樣可以解決編碼錯誤的問題.