隱形字元是程式開發上很經典的坑,常見於由其他軟體複製貼上時夾帶入境,發生在一般文件不致妨礙閱讀或列印,但遇上程式解析、比對或編碼轉換就會爆炸,我遇過的鬼故事就不少,順手解掉沒寫下來的更是不計其數:

今天遇到的案例發生在 Microsoft Teams 的 Windows 版 App。在 Teams 裡檢視 PowerPoint 投影片,我從中複製了一段文字:(如以下範例)

貼上後,.NET 程式輸出卻冒出無法識別字元,用以 Console Application 即可重現:

基於多年經驗,我很快推測是複製文字夾帶隱形字元造成。有趣的是,若將 pptx 存到本機再開啟複製同一段文字,並不會發生問題。

將有問題的文字貼到線上中文編碼解析器,妖怪現形:

ZERO WIDTH SPACE 0x200b! 由於字元寬度為零,肉眼看不出來,但按方向鍵向左向右會少移動一格,要警覺性夠高沒當成按鍵失靈才會發現。

經此一事,應付隱形字元的經驗值再 +1,到我這年紀,知識或體力拼不過年輕人,只能靠老司機的直覺扳回一城了,呵。

[2020-09-01 補充] 如果擔心程式碼被隱形字元衝康,推薦好用的 Visual Studio / VSCode 外掛工具:

感謝臉友 吳宗哲 & Dino Wang 補充

The copied text from PowerPoint viewer in Microsoft Teams app may contain invisible char.


Comments

# by Huang

髒東西真的不少,先貼到記事本,於記事本再全選複製是否可解?

# by Tom

寫個程式用regexp取代

# by Jeffrey

to Huang & Tom, 感謝回饋。文章最後有補推兩個好用的 Visual Studio / VSCode 外掛工具,應該會更簡便。

Post a comment