3

Coding4Fun - VB Strings.StrConv 簡繁轉換撞字清單

 4 years ago
source link: https://blog.darkthread.net/blog/strconv-chs-cht-issue/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
VB Strings.StrConv 簡繁轉換撞字清單-黑暗執行緒

前幾天分享的 Oracle 改 MSSQL 出中文亂碼問題,我想出 VB.NET Strings.StrConv 做簡繁轉換的解法,進一步實測踩到一枚小地雷。

我原以為 Strings.StrConv 只會轉換簡體中文字元,所以放心地把繁體中文內容也丟給它處理,沒想有卻有繁體字元被換掉了 - 「台」被換成了「臺」!

推敲了一下,應是因為簡體跟繁體都有台字,而我呼叫 StrConv 時傳入 CodePage 2052,讓繁體的「台」字被解讀成簡體的「台」,因而被對映成「臺」。面對這個狀況,我想到兩個 Workaround,第一是先用 big5.GetString(big5.GetBytes(raw)) != raw 檢測字串存在 BIG5 不相容字元時再轉換,但遇到繁體「台」字與其他簡體中文字元並存仍會有問題,所幸我的案例不致發生,可以忽略;第二個做法是事後將「臺」再置換回「台」,但風險是可能還存在其他類似情境的字元。最後我選擇了第一種做法搞定,但好奇心已被喚醒 - 多少字元有類似的繁體簡體「撞字」狀況呢?這是個一口吃完簡單有趣的 Coding4Fun 題材,就來伸展一下好了。

我先在網路上找到 BIG5 字元表

再寫一小段程式,File.ReadAllLines() 讀入解析,逐一測試每個字元是否 Strings.StrConv(raw, VbStrConv.TraditionalChinese, 2052) 之後會變成另一個字元:

void Main()
{
	Encoding big5 = Encoding.GetEncoding("big5");
	Action<string> check = (raw) => 
	{
		var conv = Strings.StrConv(raw, 
			VbStrConv.TraditionalChinese, 2052);
		if (conv != raw) 
			Console.WriteLine($"{raw} -> {conv}");
	};
	//Source: http://ash.jp/code/cn/big5tbl.htm
	foreach (var line in File.ReadAllLines(
		"d:\\all-big5-chars.txt", big5).Take(100))
	{
		if (Regex.IsMatch(line, "^[A-F0-9]{4}")) 
			line.Substring(6).Split(' ').ToList().ForEach(check);
	}
}

答案出爐。

‧ → ?
╴ → ?
¯ → ˉ
ˍ → ?
儿 → 兒
几 → 幾
丰 → 豐
凶 → 兇
台 → 臺
扑 → 撲
划 → 劃
朴 → 樸
虫 → 蟲
佣 → 傭
听 → 聽
坏 → 壞
杆 → 桿

數量沒想像多,但問題較大的應該是「几」、「凶」、「划」幾個常用字被換成意義不同的用字,因此,確認來源是簡體時再轉換是較佳的解法。

and has 0 comments

Comments

Be the first to post a comment

Post a comment

Comment
Name Captcha 49 - 34 =

Recommend

  • 151

    前端程序員的必備工具清單(MacOS)calpa02/10/2017 工欲善其事,必先利其器。一套完善的工具可以幫助我們事半功倍。而作為前端程序員的我,也是花了點時間為自己配置了一套工具。如果你也是...

  • 10

    FreeBSD src 部份由 CVS 轉換到 Subversion這兩天在 #bsdchat 上有人提到目前 FreeBSD -src tree 準備要換到 Subversio...

  • 9

    我最近開發了一套 open source,叫做 ListPower,清單力量。 ListPower 讓你可以針對特定主題,與社群一起蒐集整理資料,感受到清單力量的強大!就像這樣: 我把它 open source 開源釋出到 github:

  • 30

    ASP.NET Core CRUD 傻瓜範例 (3)上一篇提到,EF Core 是 ASP.NET Core 官方推薦的資料庫存取做法,因此,使用 EntityFramework 開發系統可以享用更多工具內建支援,像是「自動依據...

  • 19

    集保罕用字轉換工具 .NET 飆速版-黑暗執行緒多年前研究過集保罕字集與 BIG5 造字,當時我用官方提供的編碼對照表(Map_code.txt)寫過一版 .NET 轉換函式。近期接到通報說

  • 6

    XLS 轉 XLSX 批次轉換-黑暗執行緒 Excel 2007 起開始推 XLSX 格式取代傳統 XLS,距今快 15 年了,XLS 大軍仍野火燒不盡,春風吹又生。一般使用者不太會知道二者差別,但也不至於刻意選 XLS 檔,現在仍在流傳的 XLS 檔很多是代代相傳,後人開啟更新後按儲存...

  • 42

    epub vs kepub 有何不同?如何轉換發佈:2020-09-075,304 Views非技術類讀書

  • 6
    • blog.gslin.org 2 years ago
    • Cache

    搜尋引擎的替代方案清單

    搜尋引擎的替代方案清單 看到「A look at search engines with th...

  • 4

    scrollIntoView 實現清單自動捲動-黑暗執行緒 分享一個 JavaScript 小技巧,假設有個很多項目的清單,靠 CSS overflow-y: scroll 啟用垂直捲軸,除了由使用者操作上下捲動,也能用程式控制捲動到指定的一筆嗎? 用講的不容易理解,看示...

  • 5

    我的 Windows 新裝機 Chocolatey 安裝清單-黑暗執行緒 近一年買了新主機跟開始玩 Azure,開 Hyper-V 或 Azure VM 裝 Windows 的頻率變高,裝好 OS 總有一堆基本工具要安裝,工作環境備妥才好做事。 體驗過 Linux agt/yum 跟

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK