看不見的字元 '\u202a'

codemee

codemee

Posted on May 29, 2023

看不見的字元 '\u202a'

如果你在撰寫程式碼時喜歡複製文字貼上, 就要小心一些莫名奇妙的陷阱, 其中看不見的字元 '\u202a' 是最難纏的, 例如想要從 Windows 檔案總管中檔案或是資料夾的內容交談窗的安全性頁次內複製路徑貼到 Python 開發環境中, 以 Jupyter 為例, 你可能會遇到以下這樣神奇的結果:

Image description

你可以看到儲存格 51 和 53 內容是一樣的, 但是透過儲存格 52 和 54 顯示出來的結果卻不一樣, 儲存格 52 的結果在字串中多了 '\u202a' 字元, 這個字元稱為 LEFT-TO-RIGHT EMBEDDING, 如果改用 print() 顯示變數內容, 就會完全看不見。

實際上儲存格 51 和 53 內的路徑都是從同樣的交談窗中複製而來, 唯一不同的是儲存格 51 中的是用滑鼠由路徑尾端往左邊選取後複製, 而儲存格 53 中的是用滑鼠由路徑開頭往右邊選取後複製, 微軟啊微軟, 到底為什麼不同方向選取文字會有不同的結果呢?如果沒有注意到這個問題, 就可能會讓你的程式出錯。

相同的問題在其他開發環境下可能也會發生, 以下是我常用的 Thonny:

Image description

如果是在 Windows Terminal 中, 可以明確看到字串開頭處多了一個奇怪的空白:

Image description

這可能成為使用 Windows terminal 的好理由, 可以減少錯誤。經過反覆的測試後, 發現使用滑鼠由右往左選取時, 會滑過路徑開頭, 這時就會多出看不見的字元, 但如果你小心翼翼地只選取到路徑開頭就停止, 就不會選到那個看不見的字元了。

另外要注意的是, 我自己很常將程式碼貼到 PPT 上解說, 像是 Arduino IDE 有個貼心的功能可以將程式碼以 HTML 格式複製:

Image description

這個功能會以 HTML 格式幫你保留程式碼語法標色, 我通常會將複製內容貼到線上的 HTML 檢視服務, 再從該服務上把標色完成的程式碼貼到投影片上。這個轉換的過程中, 也會多出這個看不見的字元, 導致學員從投影片上複製程式碼貼回 Arduino IDE 時編譯出錯, 雖然算是一個強迫學員自己打程式碼的機制, 不過突然遇到時還是會嚇一跳, 以為範例程式寫錯了。

類似的狀況也會發生在從 VS Code 啟用保留語法標色複製程式碼時:

Image description

在 PPT 上也是以 HTML 格式貼上:

Image description

也會有同樣的問題, 使用時請多多小心。

💖 💪 🙅 🚩
codemee
codemee

Posted on May 29, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related