Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

讓 SciTE 自動偵測 UTF16-LE 無 BOM 的檔案
post by tommy @ 11 元月, 2013 09:53

由於我習慣用 SciTE 來取代原本 Notepad 的工作, 所以... 多數在 Windows 底下打開文字檔的時候, 都是去執行 SciTE. 不過... 前幾天在打開 Sandboxies 的設定檔時, 發現無法正常顯示. 出現的畫面看起來是 Unicode 編碼 (UTF16-LE), 不過, SciTE 並沒有辦法判斷出正確的編碼.

Google 找了一下, 發現有人問過作者了, 原來 SciTE 只能打開有 BOM 的 Unicode 編碼檔案.首先找了 notepad++ 回來用, 這程式果然可以正確的辨識出這類無 BOM 的檔案. 不過... 雖然 notepad++ 與 SciTE 一樣, 都是用 Scintilla 這個函式庫.... 不過還是有許多地方不太一樣, 用起來實在不太習慣. 還好...  這兩個都是 Open Source 的軟體, 所以... 直接拿 source 出來看一下.

看了一下 Source, 說真的, 這兩個軟體的 Source Code 還真的很像, 所以... 很快的就找到問題點.

--- scite/scite/src/Utf8_16.cxx.orig  2013-01-09 14:53:17.433230100 +0800
+++ scite/scite/src/Utf8_16.cxx 2013-01-09 14:55:08.308167300 +0800
@@ -12,6 +12,9 @@
#include "Utf8_16.h"
 
#include <stdio.h>
+#ifdef _WIN32 || _WIN64
+#include <windows.h>
+#endif
 
const Utf8_16::utf8 Utf8_16::k_Boms[][3] = {
{0x00, 0x00, 0x00}, // Unknown
@@ -105,6 +108,12 @@
m_eEncoding = eUtf8;
nRet = 3;
}
+#ifdef _WIN32 || _WIN64
+ // try to detect UTF-16 little-endian without BOM
+ else if (m_pBuf[0] != NULL && m_pBuf[1] == NULL && IsTextUnicode(m_pBuf, m_nLen, NULL)) {
+ m_eEncoding = eUtf16LittleEndian;
+ }
+#endif
}
 
return nRet;

只要透過這樣子處理之後, SciTE 也可以正確的辨識出這類無 BOM 的檔案了.

如果你不會自己編譯 SciTE 的話, 可以抓下頭我編的檔案.

x86: http://www.teatime.com.tw/~tommy/files/scite323_32.7z
x64: http://www.teatime.com.tw/~tommy/files/scite323_64.7z

對了... 用上頭的檔案, 有問題請自行負責吧.


2013/01/16: 修改這個 patch 加上 UTF-8 的支援. 請參考這一篇文章.
Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
迴響

  

Bad Behavior 已經阻擋了 68 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS