字符和字符串类型,我应该使用什么
Char and string types, what should I use?
在工作中,我主要使用C#,但我也想学习C++字符/字符串有点令人困惑。例如,我知道TCHAR
可以是常规char
,也可以是wchar_t
。所以,总是使用TCHAR
?但随后你会发现这样的问题,比如 TCHAR 仍然相关吗?
好吧,让我们用别的东西...?到目前为止,我只使用了char
和std::string
,在这一点上我不知道这是否是一个好方法,我有点迷茫。
如果我正在编写一个不会被翻译成其他语言的程序,我应该使用什么?
如果我正在编写一个将被翻译成其他语言的程序,我应该使用什么?
如果我正在编写一个仅在使用拉丁字符的国家/地区使用的程序,而这些国家/地区没有英语作为母语(您好ä, ö, ü, ß, æ, Ø, ï
...),我应该使用什么?
是否有我可以安全地忽略的安宁,因为它已经过时了?
非常固执己见,但基于经验答案
在我开始之前,让我声明我已经在C++软件上工作了五年,在全球拥有数百万用户 - 在此过程中,我学到了很多关于现实世界中事物如何运作的知识。
首先要了解的是Windows固有地使用它(最初是土生土长的)UTF-16标准(又名宽字符)。这样做会让你的生活变得更加艰难。(几乎)所有其他操作系统都使用 UTF-8。我的意思是;OS X,*NIX,Android,ios,几乎任何你可以扔C++编译器的东西。
因此,您是否打算在Windows之外使用您的代码?如果你不这样做,没有理由不以"窗口方式"来做,std::wstring
成为你最好的朋友。您可以轻松地使用 .c_str()
来获取const wchar_t *
(并且隐式转换为 LPCWSTR)。许多这些窗口类型(如LPCWSTR和TCHAR)实际上是宏(又名#define
)你可以在这里阅读更多。
您是否应该为 UTF-16 宽字符而烦恼?思考"如果我忽略不使用拉丁字母的语言怎么办"是非常非常非常的,当我说,不要时,请相信我。是的,您可以仅使用多字节字符,也可以仅隐式调用 API 函数的 A 变体。但是,虽然这有效(并且非常好),但如果您支持拉丁语类型以外的任何语言,则会遇到问题。即使您不这样做,用户也会期望用他们的母语输入。
博士
只有英语,跨平台?-简而言之,在Windows编程中仅使用Ansi 8位字符串本身并没有错 - 它不会使互联网崩溃,如果您编写的内容肯定只会被跨平台的英语使用者使用(美国软件?),那么我实际上建议您将项目更改为Multi-Byte,并将std::string
用于所有内容, 只是不要指望打开具有国际文件名的单个文件.
请记住,如果您的用户群数以千计,则为数以万计,人们会因无法加载汉字文件名而感到轻微的愤怒。
国际,仅限视窗 -如果你的软件甚至接近瑞典的互联网边界(在那里它需要加载一个用Goa'uld写的文件名),使用std::wstring
,使用UTF-16,并在仅限Windows的软件中感到高兴。老实说,这是当今大多数Windows软件的状态。
国际,Mac很酷吗?您的项目经理昨天想要跨平台软件,它需要在 Mac 和 PC 上运行 - 因为它被部署到的用户是 16% 的 mac 用户(根据营销),并且它需要对阿拉伯语和日语提供 IME 支持><。告诉你的项目经理你要为你所有的API调用写一个包装器,这将需要一周的时间,但如果他不同意,可以防止任何跨平台语言的废话 - 退出。
然后这样做,在引擎盖下使用 UTF-8,并使用您自己编写的包装类处理对 Windows/mac 系统的任何 API 调用。是的,这将需要一些努力和维护,但从长远来看,它可以节省大量时间。
额外链接
如果您需要非常复杂的 unicode 支持,请查看 ICU 库,OSX 在后台使用它!学习使用 BOOST - 仅文件系统支持就使跨平台C++开发速度更快
那么,总是使用TCHAR?
不是真的推荐,因为这是窗口唯一的宏。但是,如果您打算在其他平台上使用它,那么定义自己的TCHAR很容易。就我个人而言,我总是使用TCHAR - 因为我工作的应用程序是作为仅限Windows的项目开始的。
唱Unicode,一个wchar_t。那么,总是使用TCHAR?但随后你会发现这样的问题,比如 TCHAR 仍然相关吗? 好吧,让我们用别的东西...?
默认情况下,Visual Studio 将创建定义 UNICODE 宏的项目,这意味着所有 Win API 函数都将接受 WCHAR 字符串,这也意味着 TCHAR 将解析为 WCHAR -> wchar_t。因此,如果您严格只使用Windows UI,那么最好使用wchar_t和std::wstring。
如果我正在编写一个不会被翻译成其他语言的程序,我应该使用什么? 如果我正在编写一个将被翻译成其他语言的程序,我应该使用什么? ...
你为什么认为它不会?我建议你为最糟糕的场景准备代码,你的代码必须接受中国符号。因此,如果某些资源中有文本,请将它们保留在 UTF8 中,然后在 c++ 代码中使用 char 字符串来管理它们。当您需要使用某些Windows API显示它们时,请将它们转换为wchar_t。编写可移植代码,即。一个不使用任何TCHAR,WCHAR的后端 - 以及将与MFC或WinAPI或QT等平台API通信的前端。
- 我应该使用什么来代替void作为变体中的替代类型之一
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 违反const正确性:我应该现实地期待什么问题
- 我应该包含什么来制作 boost.python 扩展?
- 我应该将什么传递给glfwSetWindowSizeCallback?
- 我应该在 main 函数中写什么来测试我的问题?
- 我应该返回什么而不是标准::shared_ptr<>&?
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 在从 C++ 转换为 C# 的代码中,我应该使用什么而不是 memcpy?
- C++我应该用什么来保存格式化为字符串变量(如sprintf())的文件
- 我应该使用什么信号来终止/终止Windows上的应用程序
- 为什么我应该在scanf()-家族成员中包含一个长度修饰符作为参数?有什么好处?使用长度修改器进行扫描的作用
- 我应该在服务模板中的什么位置添加自己的代码?
- 为什么我的代码说"Yes"什么时候应该说"No"?
- mfc CEdit 我应该什么时候进行验证?
- 我什么时候应该选择"shared_ptr"而不是"make_shared"?
- 我什么时候应该使用新的智能指针
- 在使用 boost 共享互斥体时,我应该在什么情况下使用 owns_lock() 函数
- 操纵器,C 我应该使用什么顺序
- 我应该使用什么而不是-wconversion