網頁標題: 讓聽覺也不好的視障者迅速取得文字內碼!

Warning: fopen(/home/crazy/www/cmsb/bcj/has_read.php): failed to open stream: Permission denied in /home/crazy/www/compose/reading.php on line 2070

Warning: fputs() expects parameter 1 to be resource, bool given in /home/crazy/www/compose/reading.php on line 2072

Warning: fclose() expects parameter 1 to be resource, bool given in /home/crazy/www/compose/reading.php on line 2073
 



 本文淺談如何用 AutoIt, Javascript 以及 Python 來檢視「字」的內碼。目前 NVDA 算透過 Python 可以檢視內碼的工具,但它只報讀而不在點顯器顯示內碼,這對聽覺受損或障礙使用者而言很不方便。孝宇老師也私下問了我多次這類問題,因此我決定在這邊把技術留下永久記錄。

 所謂「內碼」就是每個字元都有自己的 Unicode 編號,全世界通用這個編號來識別它。自元在記憶體裡也許真的用「內碼」的數字來存,但有趣的是它在硬碟裡就不一定如何存了,字元會被「編碼」 (Encode) 後才寫入硬碟成為檔案,檔案讀進來以後要先「解碼」 (Decode) 才知道指的是哪些字元。


 

用 AutoIt 看內碼
 AutoIt 仰賴一對內建函式 AscW 與 ChrW 進行自元跟內碼的轉換:

 AscW 接受一個字串,但只把字串第一個字轉出內碼,以整數型態傳回。

 ChrW 接受一個整數,將它轉成對應的字元。

 這裡展示最簡單的寫法,讓使用者填寫輸入框,但若使用者未輸入或按 Cancel 就從剪貼簿輸入資料。將資料轉成內碼後印在對話框裡,也可以選擇性的將它存入剪貼簿。

 註:沒有親手寫圖形介面而用 InputBox/MsgBox 顯示與互動,就是簡單。

 沒有錯誤的話,最後會顯示一個視窗,用清單檢視依序列出輸入資料中每個字與其內碼。旁邊有兩個 Copy 按紐,Copy Data Only 只會把視窗上的資料抓到剪貼簿,Copy Data & Hdr/Row 會把列跟欄的標題也一起抓進來。


 

用 Javascript 看內碼
 以下示範使用 Javascript 寫一個直接顯示內碼的網頁,編輯好打字區內容後按「檢視內碼」就會在下方出現一個表格,列出打字區內所有字元的內碼,格式與 AutoIt 版本相同。

 Javascript 的 charCodeAt 方法可以拿出字串中字元 i 的內碼,但用 toString 把整數轉字串時無法限制長度,為迎合習慣上 16 進位內碼都要寫四個位數,必須藉助 substr 等方法實作補 0.


 

用 Python 看內碼
 用 Python 有兩種方式,互動跟腳本。如果像之前 AutoIt 一樣寫腳本,Python 並沒有直覺得圖形介面寫法,因此以下只介紹互動方式,來問字元的內碼。Python 互動模式就是輸入指令然後讀結果,猶如 DOS 或 Linux 系統的操作,游標停在輸入指令的地方,前面三個大於,指令打完 Enter 就會有答案。另外,Python 可以用 # 後寫單行註解到行尾。

 Python 有 2 與 3 兩個系列,雙方對字串處理方式大不相同,前者預設以位元組資料的角度處理字串,後者會自動把輸入的位元組資料解碼成 Unicode. 因為後者直接以 Unicode 角度來處理字串,查內碼也很直覺,如下:

 ord 接受一個長度 1 個字的字串,傳回那個字的內碼。hex 就可以把傳回的整數進一步轉成十六進位格式輸出。最後 exit 可以關掉 Python, 或者按 Ctrl+C, 不過導盲鼠會跟著 Ctrl+C 一起關掉然後再開啟來就無法操作鍵盤。

 然而大家都知道 NVDA 是用 Python 2 寫的,如果把這段指令搬上 Python 2 會得到如下結果:

 這個表示 ord 執行發生意外,原因是給定字串長度不只一個字。Python 2 用位元組資料的角度處理字串,台灣電腦用的 BIG-5 編碼中,中文都是二個位元組,所以 Python 回報輸入了長度 2 的字串。

 從 type 的結果可看到,也是 str, Python 2 必須使用 unicode 這種型態來進行鋼材的操作才會正確:

 有點麻煩但也只多打一個 u 而以。原則上 unicode 就跟 Python 3 的 str 一樣。

 下面展示如何用 NVDA Python 主控台與剪貼簿互動,指令很長不好打,但有興趣或很想投入附加元件開發的夥伴可以試看看:

 註:假設剪貼簿內容第一個字是「我」。

 win32clipboard 就是可以控制剪貼簿的 Python 模組,它來自 pywin32 函式庫,也被 NVDA 引入使用。必須先取得存取剪貼簿的權利後,從裡面抽出內容,然後歸還存取權,要是未歸還就打 exit() 存取權也會自動歸還,但關閉 Python 主控台前可能別的程式都無法用剪貼簿。


 所有列出的方法中,我覺得還是 AutoIt 表現最好,它能處理中英數以外的字元,也能直接與剪貼簿互動,Javascript 也能顯示這些 Unicode 但直接存取剪貼簿操作應該比較複雜,而且印出來表格導盲鼠用戶無法直接瀏覽,Python 則是受到 cmd 編碼限制,許多 BIG-5 之外的字元都變成問號,資料遺失嚴重。




本文張貼者:Bo-Cheng Jhan〔張貼時間:民國105年5月2日(星期一)12點46分 | 更新次數 #3 | 最後更新:民國105年5月4日(星期三)0點06分〕

部落格首頁


學習的故鄉首頁
本站公告:〔您越需要我們,我們就越有創意〕 本站說明書:〔發現故鄉還有改進的地方,請來信告訴原丁們〕
觀察應用學習點數 :〔咱的故鄉有您的參與,會使我們有更大的發揮空間,展現更豐富精彩的學習畫面〕 〔期待藉由無障礙網頁設計,能讓視障小朋友更愛看書、更愛寫作且更愛學習〕:盲用電腦「心得分享」
〔為了讓我們有乾淨的學習環境,請勿任意在本站散播商業廣告與不合法文件或聯結〕:本站宣示