using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//測試1
Debug.WriteLine(Microsoft.VisualBasic.Strings.StrConv(
"黑暗執行緒ABC123", Microsoft.VisualBasic.VbStrConv.Narrow)
);
//結果:黑暗執行緒ABC123
//測試2
//切成英語語系(原本為zh-TW)
Thread.CurrentThread.CurrentCulture =
new System.Globalization.CultureInfo("en-US");
try
{
Debug.WriteLine(Microsoft.VisualBasic.Strings.StrConv(
"黑暗執行緒ABC123", Microsoft.VisualBasic.VbStrConv.Narrow));
}
catch (Exception ex)
{
Debug.WriteLine("錯誤:" + ex.Message);
//結果:
// 錯誤:VbStrConv.Wide and VbStrConv.Narrow are not applicable to the locale specified.
}
//測試3 加上LCID參數
Debug.WriteLine(Microsoft.VisualBasic.Strings.StrConv(
"黑暗執行緒ABC123", Microsoft.VisualBasic.VbStrConv.Narrow, 1028));
//結果:黑暗執行緒ABC123
//測試4 簡體中文套用繁體中文LCID會產生問號
Debug.WriteLine(Microsoft.VisualBasic.Strings.StrConv(
"黑暗执行绪ABC123(简体)", Microsoft.VisualBasic.VbStrConv.Narrow, 1028));
//結果:黑暗?行?ABC123(?体)
//測試5 套用簡體中文LCID,結果正確
Debug.WriteLine(Microsoft.VisualBasic.Strings.StrConv(
"黑暗执行绪ABC123(简体)", Microsoft.VisualBasic.VbStrConv.Narrow, 2052));
//結果:黑暗执行绪ABC123(简体)
//測試6 夾雜Big5難字
Debug.WriteLine(Microsoft.VisualBasic.Strings.StrConv(
"黑暗執行緒犇ABC123", Microsoft.VisualBasic.VbStrConv.Narrow, 1028));
//結果:黑暗執行緒?ABC123
//測試7 黑暗小雜技:先將難字換成NCR,轉完半形再換回來
var ncrString = toNCR("黑暗執行緒犇ABC123");
Debug.WriteLine(ncrString); //黑暗執行緒犇ABC123
var convString = Microsoft.VisualBasic.Strings.StrConv(
ncrString, Microsoft.VisualBasic.VbStrConv.Narrow, 1028);
Debug.WriteLine(convString); //黑暗執行緒犇ABC123
var resultString = fromNCR(convString);
Debug.WriteLine(resultString); //黑暗執行緒犇ABC123
Console.Read();
}
//REF: http://blog2.darkthread.net/blogs/darkthreadtw/archive/2007/04/21/733.aspx
static string toNCR(string input)
{
StringBuilder sb = new StringBuilder();
Encoding big5 = Encoding.GetEncoding("big5");
foreach (char c in input)
{
//強迫轉碼成Big5,看會不會變成問號
string cInBig5 = big5.GetString(big5.GetBytes(new char[] {c}));
//原來不是問號,轉碼後變問號,判定為難字
if (c!='?' && cInBig5=="?")
sb.AppendFormat("&#{0};", Convert.ToInt32(c));
else
sb.Append(c);
}
return sb.ToString();
}
static string fromNCR(string input)
{
return Regex.Replace(input, "&#(?<ncr>\\d+?);", (m) =>
{
return Convert.ToChar(int.Parse(m.Groups["ncr"].Value)).ToString();
});
}
}
}