TCHAR仍然相关吗?
我是Windows编程的新手,在阅读Petzold书后我想知道:
使用TCHAR
types和_T()
函数来声明string还是我应该在新代码中使用wchar_t
和L""
string,这仍然是一个好习惯吗?
我只会定位到Windows 2000以上,我的代码将从一开始就是国际化的。
如果我今天正在做一个新项目,我仍然会使用TCHAR语法。 使用它和WCHAR语法没有多大的实际区别,我更喜欢在字符types中明确的代码。 由于大多数API函数和辅助对象都使用/使用TCHARtypes(例如:CString),因此使用它是有意义的。 此外,如果您决定在某个时间点使用ASCII应用程序中的代码,或者Windows已经发展为Unicode32等,那么它会给您带来灵活性。
如果你决定去WCHAR的路线,我会明确的。 也就是说,使用CStringW而不是CString,并在转换为TCHAR时(例如:CW2CT)强制转换macros。
无论如何,这是我的意见。
简短的回答: 没有 。
像所有其他人已经写了一样,很多程序员仍然使用TCHAR和相应的function。 在我看来,整个概念是一个糟糕的主意 。 UTF-16string处理与简单的ASCII / MBCSstring处理有很大不同。 如果你对两者都使用相同的algorithm/函数(这就是TCHAR思想的基础!),如果你只是做了比简单string连接(比如简单string连接parsing等)。 主要原因是代孕 。
唯一的例外是,如果你真的需要为不支持Unicode的系统编译你的应用程序,我觉得没有理由在新的应用程序中使用这个行李。
我必须同意Sascha。 TCHAR
/ _T()
/等的基本前提是您可以编写一个基于“ANSI”的应用程序,然后通过定义一个macros来神奇地给它提供Unicode支持。 但是这是基于几个不好的假设:
你积极地build立你的软件的MBCS和Unicode版本
否则,你会滑倒在许多地方使用普通的char*
string。
你不使用_T(“…”)文字中的非ASCII反斜杠转义
除非你的“ANSI”编码碰巧是ISO-8859-1,否则得到的char*
和wchar_t*
文字将不会代表相同的字符。
UTF-16string就像“ANSI”string一样使用
他们不是。 Unicode引入了大多数遗留字符编码中不存在的几个概念。 代孕。 结合字符。 正常化。 有条件和语言敏感的shell规则。
也许最重要的是,UTF-16很less保存在磁盘上或通过Internet发送:UTF-8倾向于用于外部表示。
你的应用程序不使用互联网
(现在,这可能是您的软件的一个有效的假设,但是…)
网页以UTF-8 格式 运行,并且使用了很多稀有的编码 。 TCHAR
概念只识别两个:“ANSI”( 不能是UTF-8 )和“Unicode”(UTF-16)。 让你的Windows API调用支持Unicode的代码可能是有用的,但是这对于使你的Web和电子邮件应用程序能够识别Unicode是没用的。
你没有使用非微软的库
没有其他人使用TCHAR
。 Poco使用std::string
和UTF-8。 SQLite的API有UTF-8和UTF-16版本,但没有TCHAR
。 TCHAR
甚至不在标准库中,所以没有std::tcout
除非你想自己定义它。
我推荐而不是TCHAR
忘记“ANSI”编码存在,除了当你需要读取一个不是有效的UTF-8文件。 忘了TCHAR
。 总是调用Windows API函数的“W”版本。 #define _UNICODE
只是为了确保您不会意外地调用“A”函数。
对string始终使用UTF编码:UTF-8用于char
string,UTF-16(在Windows上)或UTF-32(在类Unix系统上)用于wchar_t
string。 typedef
UTF16
和UTF32
字符types以避免平台差异。
如果你想知道它是否还在实践中,那么是的 – 它仍然使用了很多。 如果使用TCHAR和_T(“”),没有人会看你的代码。 我现在正在开发的这个项目正在从ANSI转换为unicode – 我们正在使用便携式(TCHAR)路线。
然而…
我的投票将是忘记所有的ANSI / UNICODE便携式macros(TCHAR,_T(“”)和所有的_tXXXXXX调用等),并假设unicode无处不在。 如果你永远不需要一个ANSI版本,我真的不觉得可移植的重点。 我会直接使用所有的宽字符function和types。 使用L预先读取所有string文字
Windows编程简介上的MSDN 文章说
新的应用程序应该总是调用(API的)Unicode版本。
TEXT和TCHARmacros今天不太有用,因为所有的应用程序都应该使用Unicode。
我会坚持wchar_t
和L""
。
我想build议一个不同的方法(两者都不)。
总结一下,使用char *和std :: string(假设使用UTF-8编码),并且仅在包装API函数时才转换为UTF-16。
有关Windows程序中这种方法的更多信息和理由可以在http://www.utf8everywhere.orgfind。;
是的,一点没错; 至less对于_Tmacros。 虽然我不太确定广泛的东西。
原因是为了更好地支持WinCE或其他非标准的Windows平台。 如果你100%确定你的代码将保留在NT上,那么你可以使用常规的Cstring声明。 然而,最好的办法是采用更加灵活的方法,因为在非Windows平台上定义这个macros要比在成千上万行代码中添加代码更容易,并且在需要移植某些库时到Windows Mobile。
TCHAR / WCHAR可能已经足够用于一些传统项目。 但对于新的应用程序,我会说不。
所有这些TCHAR / WCHAR的东西都在那里,因为历史的原因。 TCHAR提供了一种在ANSI文本编码(MBCS)和Unicode文本编码(UTF-16)之间切换的整洁方式(伪装)。 过去,人们对世界上所有语言的字符数量没有一个了解。 他们假定2个字节足以表示所有字符,因此具有使用WCHAR的固定长度字符编码scheme。 但是在1996年发布Unicode 2.0后,这种情况就不再是这样了。
也就是说:无论你在CHAR / WCHAR / TCHAR中使用哪一个,程序中的文本处理部分都应该能够处理国际化的变长字符 。
所以你实际上需要做的不仅仅是从CHAR / WCHAR / TCHAR中select一个用于Windows编程:
- 如果你的应用程序很小并且不涉及文本处理(即只是将文本string作为parameter passing),那么使用WCHAR。 由于使用Unicode支持WinAPI更容易。
- 否则,我会build议使用UTF-8作为内部编码并将文本存储在charstring或std :: string中。 调用WinAPI时将它们转换为UTF-16。 现在UTF-8是主要的编码,并且有很多方便的库和工具来处理UTF-8string。
检查这个美好的网站更深入的阅读: http : //utf8everywhere.org/
恕我直言,如果你的代码中有TCHAR,那么你正在处于抽象的错误层面。
在处理文本处理时,使用任何stringtypes是最方便的 – 这将有助于支持unicode,但这取决于您。 根据需要在OS API边界执行转换。
在处理文件path时,请使用自己的自定义types而不是使用string。 这将允许你独立于操作系统的path分隔符,会给你一个比手动string连接和分割更容易的代码接口,并且会更容易适应不同的操作系统(ansi,ucs-2,utf-8等等) 。
我看到除了明确的WCHAR之外的唯一原因是可移植性和效率。
如果你想使你的最终可执行文件尽可能小,使用char。
如果您不关心内存使用情况,并希望国际化与简单的翻译一样简单,请使用WCHAR。
如果你想让你的代码更灵活,可以使用TCHAR。
如果您只打算使用拉丁字符,则不妨使用ASCII / MBCSstring,以便您的用户不需要更多的RAM。
对于“从一开始就是国际化”的人来说,保存自己的源代码空间,并简单地使用所有的Unicodefunction。
只是增加一个老问题:
没有
在VS2010中开始一个新的CLR C ++项目。 微软自己用L"Hello World"
,nuff说。