深入了解 Microsoft.VisualBasic.Strings.StrConv 简繁转换

C#调用VB进行简繁转换的方法 本文实例讲述了C#调用VB进行简繁转换的方法。分享给大家供大家参考。具体分析如下: 首先在C#项目中引用Microsoft.VisualBasic.dll,版本自己选择合适的 然后在项目中添加引用:using Microsoft.VisualBasic; 转换: 转为繁体: outputText=Strings.StrConv(txt待转换文本, VbStrConv.TraditionalChinese); 转为简体: outputText=Strings.StrConv(txt待转换文本, VbStrConv.SimplifiedChinese); 另外还可以进行全角与半角转换,平假名 立即下载

转自:http://sanchen.blogspot.com/2007/12/microsoftvisualbasicstringsstrconv.html

 

 

 

先來觀察 Strings.StrConv 方法的簽名:

public static string StrConv(string str, VbStrConv Conversion, [Optional, DefaultParameterValue(0)] int LocaleID)

第三個參數和 MSDN 上的文件有點不同, 上面的簽名是從 Reflector 中摘出來的, 也是這篇文章要記錄的重點, 先來看一些範例:

    a1 = Strings.StrConv("书樂う반", VbStrConv.TraditionalChinese, 0x0404);    // a1 = "?樂??"
    a2 = Strings.StrConv("书樂う반", VbStrConv.SimplifiedChinese, 0x0404);     // a2 = "????"

    b1 = Strings.StrConv("书樂う반", VbStrConv.TraditionalChinese, 0x0804);    // b1 = "書樂う?"
    b2 = Strings.StrConv("书樂う반", VbStrConv.SimplifiedChinese, 0x0804);     // b2 = "书乐う?"

    c1 = Strings.StrConv("书樂う반", VbStrConv.TraditionalChinese, 0x0412);    // c1 = "?樂う반"
    c2 = Strings.StrConv("书樂う반", VbStrConv.SimplifiedChinese, 0x0412);     // c2 = "??う반"

    d1 = Strings.StrConv("书樂う반", VbStrConv.TraditionalChinese, 0x0009);    // d1 = "書樂う반"
    d2 = Strings.StrConv("书樂う반", VbStrConv.SimplifiedChinese, 0x0009);     // d2 = "书乐う반"

上面 8 個範例的第一個參數摻雜了簡中、繁中、日文和韓文, 第二個參數區分了轉簡體和轉繁體, 第三個參數是 localeID 的部分, 分別包含了 zh-TW (0x0404), zh-CN (0x0840), ko-KR (0x0412), en (0x0009), 讓我們來仔細觀察一下結果, 一切的玄機都在第三個 localeID 參數身上. 我們先假設第三個參數 localeID 是用來表示來源字串的字集, 所以如果這個假設成立的話..., 來看看結果:

  1. a1: 嗯, 一切如預期的結果, 第一步應該先將 "书樂う반" 轉成符合 zh-TW (0x0404) 的字集, 所以結果是 "?樂??", 然後再根據第二個參數 VbStrConv.TraditionalChinese 結果變成了 "?樂??", 正確!
  2. a2: 第一步同上, 然後再根據第二個參數 VbStrConv.SimplifiedChinese 結果應該要變成 "?乐??", 可是 a2 的結果卻得到了 "????", 不如預期!
  3. b1: 第一步應該先將 "书樂う반" 轉成符合 zh-CN 的字集, 所以結果是 "书樂う?", (簡體字集是有包含繁體形態 "樂" 這個字的), 第二個參數 VbStrConv.TraditionalChinese, 所以結果變成 "書樂う?", 正確!
  4. b2: 正確!
  5. c1: 韓文字集不太了解, 從結果推測韓文的漢字集如果沒有 "书" 這個字的話, 結果應該算是正確的!
  6. c2: 從 c1 的結果本來預期應該得到 "?乐う반", 可是結果卻是 "??う반", 不如預期!
  7. d1: 咦!!! 怎麼會這樣, 完全不如預期, 竟然得到如此漂亮的結果, 本來預期是 4 個 "?" 的!!!
  8. d2: 一樣得到令人搞不清楚為什麼美麗結果!!!

這到底是怎麼一回事? 是假設錯誤嗎? 可是還有什麼別的可能嗎? 為了解開這個謎團, 於是又祭出了殺手工具 "Reflector", 仔細觀察了 Microsoft.VisualBasic.dll 內的程式碼, 終於了解箇中奧秘!

先來看一下 StrConv 方法反向工程之後的一小部分程式碼(還沒到重點, 所以只節錄最後幾行),

image

再來追進 vbLCMapString 看一看, 也是看下半部就行了:

image

橘黃色是和 Encoding 相關的程式碼, 綠色和紅色底線的部分是 Win32 API 用來處理字碼轉換的函式, 綠色底線的函式有一個後綴字 A, 而且輸入的參數是 byte[], 而紅色底線部分的函式則沒有後綴字, 輸入的參數是 string.

看到這兒, 答案已經呼之欲出了, 之所以結果會不如預期都是因為 encoding.GetBytes() 和 encoding.GetString() 這兩個方法給弄砸的, 如果可以跳過它們直接叫用底下畫紅線的 UnsafeNativeMethods.LCMapString 的話, 就不會有那些討厭的問號產生了, 那要怎麼樣才能避過那段我們不想要的程式碼呢? 看一下那個底下有畫虛線的部分 "encoding.IsSingleByte", 嗯! 沒錯, 這就是為什麼 d1, d2 的結果這麼令人驚訝的原因了, 因為 en 的 Encoding 就是 SingleByte 所以會直接跳過 Unicode 和 MBCS 互轉的部分, 而直接進行 Unicode 的轉碼, 於是得到美麗的答案, 整個過程分析完畢!

雖然已經知道整個來龍去脈, 但是如果能再了解一下那個神奇的 Win32API: LCMapString 的話, 想必觀念又可以再更清楚一些. 所以我們再來看看 LCMapString 的重點吧! 嗯~~重點在哪兒咧? 以此篇文章的需求 "簡繁轉換" 來看的話, 只有第二個參數 dwMapFlags 值得我們注意, 打開 MSDN 的文件, 透過索引找到 LCMapString 的章節, 我們可以看到以下的內容,

image

針對 Windows NT 4.0 以後的作業系統, Microsoft 已經早就幫程式設計師們準備好了一個現成的系統函式來達成簡繁轉換的工作了(唉! 為什麼沒有早點知道!), 看你是要轉簡體 (LCMAP_SIMPLIFIED_CHINESE), 或是轉繁體 (LCMAP_TRADITIONAL_CHINESE), 只要給個參數, 一切就搞定了, 就是這麼簡單!

 

結論

如果您的需求和我一樣, 只是想把文字內容的簡繁部分轉換, 並不是想轉成 big5 或 gb, 整個輸出入都是 unicode, 而且也不想破壞其他非簡繁文字部分的話, 那麼結論就是照著本篇文章的一開始的 d1, d2 範例呼叫 VB 的 Strings.StrConv 帶上 0x0009 或是其他 SingleByte 字集的 localeID 當成第三個參數就可以啦!!!

如果不想引入 Microsoft.VisualBasic.dll (別問為什麼, 純屬個人偏好) 又想要做到相同的效果, 做法也很簡單, 請參考以下的範例程式碼!!!

public static class ChineseStringUtility
{
    internal const int LOCALE_SYSTEM_DEFAULT = 0x0800;
    internal const int LCMAP_SIMPLIFIED_CHINESE = 0x02000000;
    internal const int LCMAP_TRADITIONAL_CHINESE = 0x04000000;

    [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern int LCMapString(int Locale, int dwMapFlags, string lpSrcStr, int cchSrc, [Out] string lpDestStr, int cchDest);

    public static string ToSimplified(string source)
    {
        String target = new String(' ', source.Length);
        int ret = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_SIMPLIFIED_CHINESE, source, source.Length, target, source.Length);
        return target;
    }

    public static string ToTraditional(string source)
    {
        String target = new String(' ', source.Length);
        int ret = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TRADITIONAL_CHINESE, source, source.Length, target, source.Length);
        return target;
    }
}

 

簡繁體互換

转自:http://charlesbc.blogspot.com/2007/03/wq.html

 

這個在 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

 

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); //繁體的中?

Paraview:Python Calculator Filter python calculator过滤器 from paraview.simple import * connection = servermanager.Connect('localhost',11111) er = servermanager.sources.EnSightreader(CaseFileName='/.../data.case') er.PointArrays = ['x_velocity','1','y_velocity','1','z_velocity','1','cp','1'] 阅读详情

相关推荐

GPOPSII 对控制量变化率进行约束,避免控制量振荡

在这篇文章中,在GPOPSII中通过对控制量变化的约束,优化求解得到更平滑的控制量曲线,更符合真实控制约束。

Dannyfomer的博客 1871

数据库简繁转换

转换要求: 1、数据库表必须有主键 2、表之间有外键关系会报错 3、VS手动添加对Microsoft.VisualBasic的引用 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Syst

风轻云断的博客 1493

从零开始搭建多旋翼无人机:飞控系统配置全攻略(含IMU校准技巧)

本文详细介绍了从零开始搭建多旋翼无人机的飞控系统配置全流程,重点解析了IMU校准技巧。涵盖飞控硬件选型、IMU校准(加速度计、陀螺仪、磁力计)、GPS与罗盘集成方案、飞行模式配置策略及实战故障排查手册,帮助DIY爱好者提升无人机飞行稳定性与安全性。

beta5的博客 798

C#简体/繁体 互转

1、添加Microsoft.VisualBasic引用。 2、using Microsoft.VisualBasic; 简体转繁体:return Microsoft.VisualBasic.Strings.StrConv(简体 as String, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0); 繁体转简体:r

477

RADIOML 2018.01A调制信号数据集介绍及处理

RadioML 2018.01A 由 DeepSig 发布,是专门针对自动调制识别(Automatic Modulation Recognition, AMR)和无线信号分类研究设计的基准数据集。它在原有 RadioML 2016.10a 的基础上,扩展并精细化了信道仿真模型,使得信号更接近真实无线环境下的表现。该数据集广泛用于机器学习模型的训练与评估,为各类深度学习算法提供了统一、可重复的实验条件。

weixin_56527269的博客 1896

全志Longan和Tina系统T113-S3-(Tina Linux 系统介绍)

Tina Linux是全志科技基于Linux内核开发的针对智能硬件类产品的嵌入式软件系统。Tina Linux基于openwrt-14.07 版本的软件开发包,包含了 Linux 系统开发用到的内核源码、驱动、工具、系统中间件与应用程序包。Tina系统软件架构如图所示。从下至上分别为Kernel && Driver、Libraries、System Services、Applications 四层。

szembed的博客 6339

C#使用Strings.StrConv进行简繁体转换

C#中StrConv的使用学习日记   熟悉VB的人都了解StrConv的功能,它可以实现字符的转化,如可以转化为半角或者全角、在VB.net中更是增加简繁体互相转换。  C#本身没提供这个函数的数据。似乎也没有提供类似的函数功能,只能使用Encode进行转化。  以下就介绍一下,如何使用C#调用StrConv函数。   1、命名空间:Microsoft.VisualBasic

hanfon的专栏 5843

FactoryTool量产神器实战:5分钟搞定多块RK3568板卡并行烧录

本文详细介绍了使用瑞芯微FactoryTool对多块RK3568板卡进行高效并行烧录的实战指南。文章从硬件连接、驱动配置、软件操作到排错技巧,提供了一套完整的量产解决方案,重点阐述了如何利用该工具在5分钟内完成多设备固件烧录,并确保eMMC存储的写入稳定性与效率,大幅提升生产线吞吐量。

b0c1d2的博客 991

關於Micrsoft.VisualBasic.dll中Strings.StrConv的第三個參數LocaleID引起的問題

選上代碼: Code 1privatevoidbutton1_Click(objectsender,EventArgse) 2{ 3if(textBox1.Text=="") 4{ 5MessageBox.Show("請填入要轉換的文字","提示"); 6...

weixin_30621711的博客 227

AI变现案例实战系列4:AI数字员工团队——用OpenClaw搭建6个智能体,自动运营你的赚钱系统

摘要:谷歌AI产品经理Shubham Saboo利用OpenClaw搭建6人AI团队,实现内容创作、技术开发等任务自动化,每月成本不足400美元。文章对比阿里云和Windows本地两种部署方案,提供详细配置指南。通过多Agent架构实现物理隔离与精准协作,可创建6个专业AI角色(如研究员、运营、工程师等),每个Agent专注单一任务,避免记忆负担和上下文污染问题。阿里云方案适合长期稳定运行,Windows本地部署则适合零成本测试。最终可组建高效AI团队,实现7x24小时无人值守运营。(149字)

小明的博客 1141

价值投资中的AI驱动现金流预测:多智能体协作模型

在价值投资领域,准确的现金流预测是做出明智投资决策的关键。传统的现金流预测方法往往依赖于历史数据和简单的统计模型,难以应对复杂多变的市场环境和企业经营状况。随着人工智能技术的快速发展,利用AI驱动的模型进行现金流预测成为了研究热点。本文的目的在于介绍一种基于多智能体协作的模型,用于提高价值投资中现金流预测的准确性和可靠性。本文的范围涵盖了多智能体协作模型的核心概念、算法原理、数学模型、项目实战、实际应用场景以及相关工具和资源推荐等方面,旨在为读者提供一个全面且深入的关于AI驱动现金流预测的知识体系。

AI 算法实战派 679

C# 文字转换最简单的方法

引用Microsoft.VisualBasic string text=Strings.StrConv("需要转换的文字", VbStrConv.TraditionalChinese, 1); VbStrConv 枚举 转载于:https://www.cnblogs.com/codeyou/p/4956427.html...

a19790318的博客 188

想使用dify实现docx文档的自动生成?试了一圈,感觉还是根据python-docx更靠谱

在软件开发过程中,需求文档、设计文档等材料的编写是每个开发者都绕不开的工作。最近笔者接到一个需要批量生成标准化需求文档的任务,尝试了目前热门的低代码工具Dify后,发现对于稍微复杂格式的文档生成需求(例如文本居中这么简单的需求),最终还是回归到基于python-docx库的解决方案。本文将分享两种技术路线的对比实践。

xiezhipu的博客 2548

深入 Microsoft.VisualBasic.Strings.StrConv 簡繁轉換

 深入 Microsoft.VisualBasic.Strings.StrConv 簡繁轉換  昨天又遇到一個簡繁轉換的需求, 雖然這個問題以前已經處理過了, 但是以前是用自己建立的 b52gb 和 gb2b5 的對應表來完成這個需求(VB6 的話就用 StrConv 方法來達成), 在 .NET 環境中, Microsoft.VisualBasic.dll 裡也有提供 Strings

简单的快乐 5320

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【转自优快云】深入 Microsoft.VisualBasic.Strings.StrConv 簡繁轉換

深入 Microsoft.VisualBasic.Strings.StrConv 簡繁轉換 昨天又遇到一個簡繁轉換的需求, 雖然這個問題以前已經處理過了, 但是以前是用自己建立的 b52gb 和 gb2b5 的對應表來完成這個需求(VB6 的話就用 StrConv 方法來達成), 在 .NET 環境中, Microsoft.VisualBasic.dll 裡也有提供 Strings.S...

weixin_30338743的博客 130

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Microsoft.VisualBasic.dll的妙用(开发中肯定会用到哦)

前言 做过VB开发的都知道,有一些VB里面的好的函数在.NET里面都没有,而Microsoft.VisualBasic.dll却给我们提供使用这些函数的功能(没用过VB的这些功能一样可以使用,大同小异而已) 今天这里主要讲两个:一个是繁简转换,另一个是计算时间差,相信大家都有方法实现这两个功能,而我今天讲的却是只各需一句代码就实现这两个功能! 功能一:繁简转换 首先...

dianchenai7336的博客 420

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C#简繁体转换方法(Microsoft.VisualBasic.dll)

1. 参考Microsoft.VisualBasic.dll2. 转简体代码private void btnCHS_Click(object sender, EventArgs e)        {            string src = txtSrcText.Text.Trim();            string des = Microsoft.Vis

边城骆驼 -- 每天进步百分之一 4199

C#简繁转换

添加 Microsoft.VisualBasic引用 /// <summary> /// 转换为简体中文 /// </summary> public static string ToSChinese(string str) { re...

weixin_30619101的博客 102

c#简繁转换示例

首先 添加Microsoft.VisualBasic.dll引用using Microsoft.VisualBasic;string gb2312 = "国营农场";string big5 = "";big5 = Strings.StrConv(gb2312, VbStrConv.TraditionalChinese, 0);Console.WriteLine(big5);

博客已转移至:http://www.cnblogs.com/wu-jian/ 1992

简繁转换

Public Shared Function Traditional2Simplified(ByVal str As String) As String '繁体转简体 Return (Microsoft.VisualBasic.Strings.StrConv(str, Microsoft.VisualBasic.VbStrConv.Simplified...

weixin_30512043的博客 82

分享 .net 簡繁轉換

//功能:简繁转换 //命名空间 (Namespace)∶Microsoft.VisualBasic //模组:Strings //组件 (Assembly):Visual Basic Runtime Library (in Microsoft.VisualBasic.dll) string targetString = "广东省"; string strsouce = Microsoft.VisualBasic.Strings.StrConv(targetString, Microsoft.

ShulingLiu的专栏 632

.net简繁体转换

记录下,免得用的时候到处找 方法一 /// <summary>/// 中文字符工具类/// </summary>public static class ChineseStringUtility { private const int LOCALE_SYSTEM_DEFAULT = 0x0800; private const int LCMAP_S...

weixin_30439031的博客 112

VB.net下有个函数strconv可以进行简体繁体转换(转载)

http://msdn.microsoft.com/zh-cn/library/cd7w43ec.aspx 有个简单的方法,VB.net下有个函数strconv可以进行简体繁体转换,添加引用Microsoft Visual Basic .Net Runtime string mStr=Microsoft.VisualBasic.S...

aiyinzhi8916的博客 429

指定形式字符串转化以及字符串编码转换

Strings.StrConv 方法  返回已转换为指定形式的字符串。 命名空间:Microsoft.VisualBasic using Microsoft.VisualBasic;  //引用Microsoft.VisualBasic命名空间 程序集:Microsoft.VisualBasic.Runtime(在 microsoft.visualbasic.dll 中)

程序人生,学海无涯 1375
上一篇: “网页无法显示”的错误代码说明(iis环境)
下一篇: 二叉树
boby16
博客等级 码龄21年 18粉丝 25原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值