字符串和字符串类型,我应该使用什么?

时间:2016-03-17 08:47:38

标签: c++ string visual-c++ char

在工作中我主要使用C#,但我也想学习C ++,而字符/字符串有点令人困惑。例如,我知道TCHAR可以是常规char,或者,如果我使用Unicode,则wchar_t。那么,总是使用TCHAR?但是你会发现像Is TCHAR still relevant?这样的问题。
好吧,让我们用别的东西......?到目前为止,我只使用了charstd::string,此时我不知道这是不是一个好方法,我有点迷失。

如果我正在编写一个将翻译成另一种语言的程序,我该怎么用?
如果我正在编写一个将被翻译成另一种语言的程序,我该怎么用?
如果我正在编写的程序只能在使用拉丁字符的国家/地区使用,而这些程序不使用英语作为母语(hello ä, ö, ü, ß, æ, Ø, ï ...),我该怎么用?
我是否可以放心地忽略它,因为它已经过时了?

2 个答案:

答案 0 :(得分:0)

  

那么,总是使用TCHAR?

不是真的推荐,因为这只是windows only macro。但是如果您打算在其他平台上使用它,那么很容易定义您自己的TCHAR。我个人总是使用TCHAR - 因为我开始的应用程序是作为一个仅限Windows的项目启动的。

  

唱Unicode,一个wchar_t。那么,总是使用TCHAR?但是你发现像TCHAR这样的问题仍然有用吗?   那么,让我们用别的东西......?

默认情况下,Visual Studio将创建定义了UNICODE宏的项目,这意味着所有Win Api函数都将接受WCHAR字符串,这也意味着TCHAR将解析为WCHAR - > wchar_t的。因此,如果您仅使用Windows UI严格工作,那么最好使用wchar_t和std :: wstring。

  

如果我正在编写一个不会被翻译成其他语言的程序,我该怎么用?   如果我正在编写一个将被翻译成另一种语言的程序,我该怎么用?   ...

为什么你认为它不会?我建议你为最糟糕的场景准备代码,你的代码必须接受Chineese符号。因此,如果您在某些资源中有文本,那么将它们保存在UTF8中,然后在您的c ++代码中使用char字符串来管理它们。当您需要使用某些Windows API显示它们然后将它们转换为wchar_t。编写可移植代码,即。一个没有使用任何TCHAR,WCHAR和前端的后端,它将与MFC,WinAPI或QT等平台API进行通信......

答案 1 :(得分:0)

沉重的自以为是,但基于经验回答

在开始之前,让我说我已经在C ++软件上工作了五年,全球有数百万用户 - 这样做我已经学到了很多关于工作方式的知识在现实世界中

首先要理解的是Windows固有地使用它的(originally homegrown) UTF-16标准(aka,wide-char)。这样做会让你的生活变得更加艰难。 (几乎)其他每个操作系统都使用UTF-8。我的意思是; OS X,* NIX,Android,Ios,几乎任何你可以抛出c ++编译器的东西。

因此,您是否打算在Windows之外使用您的代码? 如果你不这样做,没有理由不这样做“windows方式”,std::wstring在这里成为你最好的朋友。您可以非常轻松地使用.c_str()获取const wchar_t *(并隐式转换为LPCWSTR)。许多这些窗口类型(例如LPCWSTR和TCHAR,实际上是宏(又名#defineYou can read more on that here

你应该打扰UTF-16宽字符吗?
非常非常认为“如果我忽略那些不使用拉丁字母的语言”,请相信我,不要。 是的,您可以使用Multibyte characters only,或仅隐式调用the A variants of API functions。 然而,虽然这很有效(并且很好),但如果你支持拉丁语以外的任何语言,你将遇到问题。即使您不这样做,用户也希望以他们的母语输入。

TL;博士

仅限英语,跨平台? - 简而言之,只有在Windows编程中使用Ansi 8位字符串没有任何内在错误 - 它不会崩溃互联网,如果你写了一些你确定知道的东西只有跨平台的英语使用者(美国的软件?)然后我实际上建议将你的项目更改为多字节,并使用std::string来处理所有事情,只是不要指望打开A single file with a international filename
记住这一点,如果你的用户群数以千计为单位,如果成千上万,那么人们将因为无法加载汉字文件名而感到温和。

国际,仅限Windows - 如果您的软件即将接近瑞典的互联网边界(需要加载Goa'uld中编写的文件名),请使用std::wstring,使用UTF-16,并且在仅使用Windows的软件中感到高兴。说实话,这是今天大多数 Windows软件的状态。

国际,Mac很酷吗? - 您的项目经理昨天需要跨平台软件,它需要在Mac和PC上运行 - 因为它部署的用户是16%的mac用户(根据市场营销),并且需要IME支持阿拉伯语和日语。登记/> 告诉你的项目经理你要为你的所有API调用写一个包装器,这需要一个星期的时间,但如果他不同意的话,会阻止任何跨平台语言的废话 - 退出

然后执行此操作Use UTF-8 under the bonnet,并使用您自己编写的包装类处理对Windows / mac系统的任何API调用。是的,它需要一些努力和维护,但它可以让你长期保存很多的时间。

EXTRA LINKS

If you need very complex unicode support, check out the ICU library, OSX uses this under the hood!)
Learn to use BOOST - the filesystem support alone makes cross-platform C++ development much,快得多