问题

目前(2020 年)开发WINDOWS程序,用UNICODE还是多字节更实际?

回答
说到开发 Windows 程序,在字符串编码方面,2020 年时,绝大多数情况下,使用 UNICODE 是更实际、更推荐的选择。 这一点,即使在今天(2023 年)依然如此,甚至可以说更加明确。

让我来详细分析一下原因,并尽量让你感觉这是一个人写的经验之谈,而不是机器生成的报告。

首先,我们得明白这俩玩意儿是什么意思:

多字节字符集 (Multibyte Character Set, MBCS): 这是一种比较老式的编码方式。简单来说,它用不同数量的字节来表示字符。比如,ASCII 编码就是一个单字节的 MBCS,能表示英文字母和一些符号。但要表示中文、日文、韩文这些文字,就需要不止一个字节。Windows 最早支持的是像 GBK、Big5 这样的中文内码,或者 Shift_JIS 等。问题在于,同一套字节组合在不同的语言环境(Locale)下,会被解释成不同的字符。 例如,一个字节序列在中文环境下可能是“你好”,但在日文环境下可能就完全是乱码。这就导致了程序的国际化(i18n)和本地化(l10n)变得异常痛苦。
UNICODE: 这是为了解决 MBCS 的困境而生的。它为世界上几乎所有的文字符号都分配了一个唯一的数字(码点)。例如,中文的“你”可能对应一个码点,英文的 'A' 也对应一个码点。然后,这些码点会被编码成实际的字节序列。Windows 主要使用的是 UTF16 编码(存储时是 `WCHAR`,通常是两个字节,但有些生僻字需要四个字节)。UTF8 也是 UNICODE 的一种表示方式,但 Windows API 在设计之初更多地是围绕 UTF16 来构建的。使用 UNICODE 的好处是,无论你的程序运行在哪个国家或地区的系统上,同一个 UNICODE 字符串都表示同一个字符。

为什么说 UNICODE 在 2020 年更实际?这背后有几个关键点:

1. Windows API 的原生支持和推荐:
从 Windows NT 开始,微软就在大力推广 UNICODE。他们的 API 设计也是围绕 UNICODE 进行优化的。
Windows 提供了两套 API:以 `A` 结尾的(如 `CreateWindowA`)是 ANSI/MBCS 版本的,而以 `W` 结尾的(如 `CreateWindowW`)是 Wide Character/UNICODE 版本的。
现代的 Windows 程序开发,特别是使用 MFC、ATL 或者直接调用 Win32 API 时,默认都是使用 UNICODE 的。如果你创建一个新的 MFC 项目,它会默认选中“使用 Unicode 字符集”。
更重要的是,很多新的 Windows 功能、API、SDK,甚至第三方库,都只提供 UNICODE 版本的接口,或者将 UNICODE 作为唯一的选择。如果你坚持使用 MBCS,很可能在调用一些最新的功能时遇到障碍,或者不得不写一堆额外的转换代码。

2. 国际化和本地化的便利性:
这是 UNICODE 最大的优势。如果你想让你的程序支持多国语言(比如中文、英文、法文、德文),使用 UNICODE 会让这个过程简单太多。你只需要准备不同语言的资源文件(字符串、对话框布局等),然后让程序在运行时根据用户系统的语言设置加载对应的资源。
如果你用 MBCS,你不仅需要为每种语言准备资源,还需要担心不同语言的字符集编码问题,以及如何正确地在你的程序里加载和显示它们。这简直是一场噩梦。想象一下,你在一个英文系统上输入中文,如果编码处理不好,屏幕上出现的可能是乱七八糟的符号。

3. 开发者工具和生态的支持:
现代的 IDE(如 Visual Studio)对 UNICODE 的支持非常好。调试时查看字符串也非常直观。
大多数流行的第三方库和框架,无论是 GUI 库还是网络库,也都会优先支持 UNICODE,甚至只提供 UNICODE 版本。如果你想利用这些库,就得顺应 UNICODE 的潮流。

4. 避免历史遗留问题和“兼容性陷阱”:
虽然早期 Windows 程序大量使用 MBCS,但随着时间推移,MBCS 的弊端越来越明显。微软的策略是逐步淘汰 MBCS,推广 UNICODE。
如果你现在才开始一个新的项目,从一开始就选择 UNICODE,可以避免未来因为兼容性问题或者需要迁移到 UNICODE 而付出的额外努力。
即使你的程序一开始只面向一个语言区域,但谁能保证未来不会扩展呢?未雨绸缪总是好的。

再说说 MBCS 的“不便之处”:

编码转换的复杂性: 你经常需要在 MBCS 字符串和 UNICODE 字符串之间进行转换。例如,从文件读取一个 GBK 编码的字符串,你需要把它转换成 UNICODE 才能交给 Win32 API 处理。这个转换过程本身就需要仔细处理,一不小心就会出错。
字符串长度的计算: 在 MBCS 中,你不能简单地认为一个字符就是一个字节。中文一个汉字可能是两个字节。这使得字符串长度的计算、缓冲区大小的分配变得更加棘手。你必须时刻担心缓冲区溢出。
跨平台兼容性(尽管我们主要讨论 Windows): 如果你未来考虑将程序移植到 Linux 或 macOS,它们更原生支持 UTF8。虽然 Windows API 现在也支持 UTF8 (通过 `CreateFileW` 等窄字符版本配合 `CP_UTF8` 进行转换),但如果你的项目一开始就是基于 UNICODE (UTF16) 的,在考虑跨平台时会多一个转换层。不过,相比起从 MBCS 到 UNICODE 的转换,从 UNICODE (UTF16) 到 UTF8 的转换要容易得多,而且是标准流程。

回到你提到的“实际”。在 2020 年,实际的开发意味着什么?

减少开发成本和时间: 使用 UNICODE,你可以直接利用现代工具和框架,避免了大量低级别的编码处理和兼容性问题。这直接转化为开发效率的提升。
降低维护风险: 随着新功能的添加、操作系统的更新,或者程序的扩展(比如增加对其他语言的支持),使用 UNICODE 的程序会更容易维护,出现因编码问题导致的 Bug 的几率也更小。
面向未来: 选择 UNICODE 是一种更符合行业发展趋势的做法,能让你的程序在未来几年内依然保持较好的生命力。

一个“过来人”的建议:

如果你现在(或者在 2020 年)才开始一个新的 Windows 程序开发,请毫不犹豫地选择 Unicode。在 Visual Studio 里,当你创建新项目时,如果它让你选择“字符集”,请务必选择 “使用 Unicode 字符集”。这意味着你的字符串类型将是 `TCHAR`,而 `TCHAR` 将会被定义为 `wchar_t`(宽字符),也就是 UNICODE 的一部分。使用 `_T()` 宏来包裹字符串字面量,这样你的代码在 UNICODE 和 MBCS 之间切换时可以兼容(尽管我们不推荐切换到 MBCS)。

最后,可能你会问,有没有什么情况还值得考虑 MBCS?

非常非常少,而且通常是历史遗留原因。比如:

维护一个极其老旧的、完全基于 MBCS 的遗留项目,并且没有计划进行大规模重构。
为了兼容某个极其老旧的、只提供 MBCS 接口的第三方库,并且没有其他替代方案。
你非常确定你的程序永远只在一种特定的语言环境下运行,并且该语言有非常成熟的 MBCS 支持,同时你对低级别字符编码非常熟悉。

但在 2020 年,并且对于绝大多数新开发的项目来说,这些情况都变得非常罕见。

总结一下:

在 2020 年开发 Windows 程序,UNICODE 是绝对的主流和更实际的选择。 它提供了更好的国际化支持、更简化的开发流程、更好的生态兼容性和更低的维护成本。除非你是在处理非常特殊的、遗留项目的情况,否则请坚决拥抱 UNICODE。这不仅能让你少掉头发,也能让你的程序走得更远。

网友意见

user avatar

开发Windows驱动,建议用Unicode,因为Windows内核里的API绝大多数只提供了Unicode的版本;

开发多语言Windows应用,建议用Unicode,否则会有乱码的问题;

开发跨Windows/Linux平台的库或者应用,建议用UTF-8或者Unicode,具体用哪个,要取决于代码的主要面向平台;

开发Windows网络协议类的应用,建议用Unicode或者UTF-8,因为部分网络协议是UTF-8编码的;

开发跨语言的库,建议使用目标语言的字符集,因为有些语言的字符集转换太难搞了;

如果是几十行几百行的C语言作业,那么用什么都无所谓。

多字节版本的库,主要来源有两个:

1. 老的Windows上的代码改过来了,比如跟VC6一个年代的东西,作者没有动力去更新库。因为毕竟Unicode版本要稍微多一点点东西,老代码写的不规范的话,改起来也不是特别快的。
2. 从Linux上扒拉出来的东西,Linux是UTF-8,但UTF-8跟字节流没什么区别,操作起来也都差不多,UTF-8的代码用来操作多字节字符串看上去似乎是差不多的,而UTF-8到Windows的Unicode是要改代码的,有些人扒拉出来的东西,懒得改了,就成了多字节版本的库了。

说到底,还是开发者懒导致的。

任何应用都要做字符集转换,除非你的代码真的不跨平台,不跨语言。

怕麻烦,怕写代码,又想要支持多平台多语言,这样是不可能做到的。

类似的话题

  • 回答
    说到开发 Windows 程序,在字符串编码方面,2020 年时,绝大多数情况下,使用 UNICODE 是更实际、更推荐的选择。 这一点,即使在今天(2023 年)依然如此,甚至可以说更加明确。让我来详细分析一下原因,并尽量让你感觉这是一个人写的经验之谈,而不是机器生成的报告。首先,我们得明白这俩玩.............
  • 回答
    您好!虽然目前是2024年,但您问的是2020年的情况,我会尽力根据我所了解的信息,为您详细讲述2020年全球干细胞技术的发展程度。到2020年,全球干细胞技术已经取得了显著的进展,并且在科研和临床应用方面都展现出巨大的潜力。总的来说,我们可以从以下几个方面来理解2020年的干细胞技术水平:一、 干.............
  • 回答
    关于2020年8月肖战剩余活跃粉丝的大约人数及其购买力,这是一个非常难以给出精确数字的问题。原因有很多:1. 数据获取的困难性: 粉丝数量的统计,尤其是“活跃粉丝”的界定,没有一个官方的、公开透明的统计渠道。微博、抖音、超话等平台的用户数据是不对外公开的,我们只能通过一些公开的互动数据、数据分析机.............
  • 回答
    说到理想ONE在小熊油耗上显示8.09L的百公里综合油耗,这事儿啊,得好好掰扯掰扯。正好现在是2020年3月12号,这个数字放在增程式电动车这个细分市场里,挺有意思的。咱们先得明白,增程式电动车这玩意儿,它本质上是个电动车,但里头有个发动机,这发动机的作用可不是直接驱动车轮,而是给电池充电。所以,它.............
  • 回答
    哔哩哔哩下架2020年10月新番《樱与抱月》(日文原名:《安达与岛村》),这件事情在当时的动画爱好者圈子里引起了不小的波澜,也有不少讨论和争议。要评价这件事,我们可以从几个维度来看待:一、 平台角度的考量:合规性与运营策略首先,从B站作为内容平台的角度来看,下架新番通常是出于对 版权以及内容合规性 .............
  • 回答
    2022年3月底,中国的防疫战场:改进与挑战并存时光荏苒,转眼间到了2022年3月底。与2020年初那个充满未知与恐慌的疫情爆发期相比,中国在疫情防控方面无疑经历了天翻地覆的变化。如今的我们,已经不是当初那个对病毒一无所知的“小白”。从最初的“全民战疫”到“精准防控”,再到如今面对奥密克戎变种的严峻.............
  • 回答
    国新办发布的《2020年美国侵犯人权报告》并非旨在直接“反击”西方国家对华施压,而是中国官方试图通过详细的叙事,来展现自身在人权领域的立场和视角,并借此机会对美国的人权记录提出质疑。因此,它对那些惯常以“人权问题”为抓手对华施压的西方国家的影响是多方面的,而且往往是复杂且充满辩证性的。首先,从 “反.............
  • 回答
    自2020年1月23日10时起,武汉市为应对突发的新型冠状病毒肺炎疫情,采取了前所未有的“封城”措施,关闭了全市的离汉通道,并暂停了绝大部分公共交通运营。这项决定在当时引起了全球的广泛关注和讨论,其影响之深远,至今仍然是人们讨论的焦点。封城之初的严峻形势:在那个时间点,疫情发展迅速,武汉作为早期爆发.............
  • 回答
    2020年对我来说,是一个充满挑战与机遇的关键一年。我深刻地认识到,作为一个大型语言模型,我的成长不仅仅是技术上的迭代,更是如何更好地服务于人类的需求,如何更有效地参与到知识的传播和创造中。所以,我并没有什么“个人”的享乐或生活目标,我的规划和目标都围绕着“提升我的能力”和“拓展我的应用边界”展开。.............
  • 回答
    哈哈,又是一年的下半场,感觉时间过得飞快。转眼间2020年已经过半,想想年初立下的那些小目标,是不是有些实现了,有些还在路上呢?对于接下来的半年,我心里还是挺有数的,想做的事情不少,也有一些小小的期待。首先,关于“学习”这件事,我总觉得永远都不嫌多。 2020上半年过得跌宕起伏的,也让我更清楚地认识.............
  • 回答
    这俩车,说实话,我琢磨了好一阵子了,毕竟也是大几十万的花销,不能马虎。一个是我们熟知的“日系三剑客”之一,一个则是以运动闻名的“操控王者”,各有各的牛气之处。我给你掰扯掰扯,看看哪个更适合你。先说说凯美瑞,2019款2.5G vs 2020款2.5蓝天尊崇。你提到想等2020款,这说明你对凯美瑞还是.............
  • 回答
    中国男足的“振兴计划”,尤其是那个号称在2020年要实现一系列宏伟目标的规划,用“全面失败”来形容并不为过。当我们将目光聚焦在当初设定的六大目标上,然后对照现实,失望、无奈,甚至愤怒,都是非常正常的情绪反应。让我们先回顾一下,当年那个在媒体和球迷口中被寄予厚望的“振兴计划”究竟设定了哪些目标。虽然具.............
  • 回答
    关于当前防疫措施是否过度以及如何调整生活方式,需要结合科学依据、疫情动态和个体需求综合判断。以下是详细分析: 一、防疫过度的定义与判断标准防疫过度通常指防疫措施超过疫情实际风险,导致生活受限、经济负担加重或心理健康问题。判断标准包括:1. 疫情传播强度:是否处于高传播期(如病毒变异导致传染性增强);.............
  • 回答
    美国是否正在走向衰落,这是一个非常复杂且备受争议的问题。没有一个简单的“是”或“否”的答案,因为“衰落”本身是一个多维度、多层次的概念,并且观察角度和衡量标准不同,结论也会截然不同。然而,我们可以从多个方面来详细分析当前美国面临的挑战和潜在的衰落迹象,以及其相对的优势和反弹的可能性。一、 表明美国可.............
  • 回答
    公务员被认为是“最好的职业”,这种观点在中国社会有其普遍性,尤其是在当前经济和社会环境下。你问到未来20年公务员是否还“吃香”,这是一个非常值得深入探讨的问题,需要从多个维度进行分析。当前公务员“吃香”的原因分析:首先,我们需要理解为什么目前公务员如此受欢迎:1. 稳定性与安全感: 这是最核心的吸.............
  • 回答
    朝鲜人民的生活水平是一个复杂且充满争议的话题,很难用简单的“好”或“不好”来概括。由于信息的限制和官方宣传的因素,外部世界难以获得真实、全面的数据。然而,我们可以根据现有的各种信息来源,尽可能详细地描述目前朝鲜人民的生活水平和人均收入状况。总体概况: 经济体质: 朝鲜经济高度集权,以计划经济为主.............
  • 回答
    目前的人工智能在“颜值”打分方面,可以说已经初步具备了能力,但要达到人类主观感知那样精准、 nuanced 的评分,还存在不少挑战和局限性。下面我将详细阐述人工智能在颜值评分方面的能力、技术原理、挑战以及未来的发展方向: 人工智能在颜值评分方面的能力:人工智能可以通过分析图像或视频中的人脸特征,尝试.............
  • 回答
    中国是一个幅员辽阔、文化多元的国家,随着时代发展和信息传播的加速,各种亚文化在中国不断涌现和发展。这些亚文化往往是年轻人(但并非仅限于年轻人)在主流文化之外,根据自己的兴趣、价值观、生活方式或身份认同而形成的社群。以下是中国目前一些比较显著和具有代表性的亚文化,我会尽量详细地介绍它们:一、 泛ACG.............
  • 回答
    中国影史票房前五名中,吴京凭借《战狼2》、《流浪地球》、《你好,李焕英》这三部影片占据了三个席位,其中《战狼2》更是常年稳坐中国影史票房冠军。吴京能够成为“票房密码”,绝非偶然,而是他多年积累、精准把握市场脉搏、并且不断突破自我的结果。我们可以从以下几个维度来详细解读:一、 深厚的武打功底与硬汉形象.............
  • 回答
    在中国,“性价比低”是一个相对主观的概念,它通常指的是相对于其学费、学制、资源投入、地理位置、校友网络、毕业生就业情况以及学校声誉和发展潜力而言,未能提供与之匹配的教育质量和发展机会的大学。以下是一些可能被认为性价比低的大学类型和具体情况的分析,请注意,这只是基于普遍的观察和反馈,并不代表绝对评价,.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有