2007年3月6日 星期二

簡繁體互換

簡繁體互換
這個在 dotnet 上,需籍用 Microsort.VisualBasic.dll 的力量了
using Microsoft.VisualBasic;

string str = "中國"; str = Strings.StrConv(str, VbStrConv.SimplifiedChinese, 2052);
MessageBox.Show(str); //簡體的中國
str = Strings.StrConv(str, VbStrConv.TraditionalChinese, 1033);
MessageBox.Show(str); //繁體的中國

請參考 String.StrConv 的 msdn 說明
注意到:
第一個參數是待轉換的字串
第二個參數欲轉換成字體列舉值 (enum)
第三個參數(重要),是文字轉換完後,最後對應的編碼格式 (LocaleID)

1028 繁體中文
1033 ASCII
2052 簡體中文



為何第二次轉換回繁體時,不用 1028 而用 1033 呢?
首先,要先知道,有些簡體中文的編碼值是在繁體中文是對應不到任何字的。此時,顯示的字就會是 "?" 號。
因為 2052 的 「 国] 已經是簡體字了,轉回到繁體時,剛好其編碼對應不到1028 的編碼,因此會是問號。

最好的方法,是以 en-US 做為編碼格式。當以 en-US 做為最後的編碼格式時,又碰到亞洲字時,就會以 unicode 做為儲存編碼格式。此剛好與 dotnet 的 string 儲存格式相同。因此解決了所有問題。

因此,當我們在做簡繁轉換時,請將第三個參數都設成 1033

[20090225]

請大家參考這一篇 http://sanchen.blogspot.com/2007/12/microsoftvisualbasicstringsstrconv.html 

此篇看到了追求真理的人性光輝。並且,最後也寫了一個更佳的範例。

相較之下,我研究的欲望還真是微不足道呢!

4 則留言:

匿名 提到...

str = Strings.StrConv(str, VbStrConv.TraditionalChinese, 2052);
MessageBox.Show(str); //繁體的中國

請問為何不用1033用2052也可以轉成繁體呢?

如果您知道原因的話,請mail告訴我一下,
謝謝!
minying0301@yahoo.com.tw

秉程 提到...

以下程式碼,您就大概清楚了。這是字碼對應的關係。

string str = "中國";
str = Strings.StrConv(str, VbStrConv.SimplifiedChinese, 1033);
Console.WriteLine(str); //簡體的中國
str = Strings.StrConv(str, VbStrConv.TraditionalChinese, 1033);
Console.WriteLine(str); //繁體的中國

str = Strings.StrConv(str, VbStrConv.SimplifiedChinese, 2052);
Console.WriteLine(str); //簡體的中國
str = Strings.StrConv(str, VbStrConv.TraditionalChinese, 2052);
Console.WriteLine(str); //繁體的中國

str = Strings.StrConv(str, VbStrConv.SimplifiedChinese, 1028);
Console.WriteLine(str); //簡體的中?
str = Strings.StrConv(str, VbStrConv.TraditionalChinese, 1028);
Console.WriteLine(str); //繁體的中?

CowCow 提到...

Follow your instruction, it works fine for most characters, except two (so far I find)
1. 建筑
2. 圣保禄

Can you test it for me?if same issue occur in your program

Zohan 提到...

我想請教一下,第三個參數LocaleID的碼錶在官網哪裡可以查到嗎?

Share with Facebook