C++ VC++;?

C++ VC++;?,c++,string,visual-c++,unicode-string,C++,String,Visual C++,Unicode String,如何在VC++中使用unicode字符串?当然,您应该定义UNICODE,但是字符串呢 是应该在所有文本周围使用TEXT()或_T()宏,还是应该在字符串前面加一个L?我认为现在所有的程序都应该使用unicode,所以使用L前缀不是最干净的吗 意见?用L前缀声明Unicode字符串文字 TEXT()或\u T()宏适用于糟糕的旧时代,当时您需要为Unicode和非Unicode版本的Windows(Windows 9x)编译单一源代码。谢天谢地,今天您可以安全地忽略Windows 9x。这取决于

如何在VC++中使用unicode字符串?当然,您应该定义UNICODE,但是字符串呢

是应该在所有文本周围使用TEXT()或_T()宏,还是应该在字符串前面加一个L?我认为现在所有的程序都应该使用unicode,所以使用L前缀不是最干净的吗


意见?

L
前缀声明Unicode字符串文字


TEXT()
\u T()
宏适用于糟糕的旧时代,当时您需要为Unicode和非Unicode版本的Windows(Windows 9x)编译单一源代码。谢天谢地,今天您可以安全地忽略Windows 9x。

这取决于您想要实现的目标。如果要确保代码在使用和不使用Unicode的情况下都能正确编译和工作,请使用
文本
\T
宏,并调用“默认”Win32函数名(例如
CreateWindow

如果要确保程序始终使用Unicode API,则应在字符串前面使用
L
前缀,并调用Win32函数的广泛版本(例如
CreateWindowW

在后一种情况下,无论是否定义了
unicode
,您都将获得unicode行为。 在前一种情况下,应用程序将根据是否定义了
UNICODE
来更改其行为


我同意您的看法,非unicode版本自Win98以来就没有真正的相关性,因此我选择第二种方法。

我刚才学到的一些东西:

黄金法则: 不要与框架抗争。
执行框架设计的操作——如果使用Windows,请使用
\u T
,使代码独立于字符类型。如果您在Linux上,请使用UTF-8。如果你有一个跨平台的框架,做任何事情。但是,除非你有很好的理由,否则不要试图发明你自己的东西。(通常不值得在框架上下功夫。)

为了可移植性和可读性,我强烈反对使用微软神奇的T字串,而只使用宽字串。我不同意。不要使用wchar\t。它不是便携式的。使用char和UTF-8。@Axel请告诉我如何调用UFT-8版本的
GetWindowText
?@Axel:除了Win32 API不接受UTF-8之外,UTF-8限制了可移植性
wchar\u t
的可移植性与
int
的可移植性相同。它不能保证在所有平台上都是相同的大小,并且它的内部表示可能不同,但是使用该类型存储它要存储的内容的源代码将在所有平台上工作。对于跨平台代码,在任何情况下都必须在编码之间进行转换,因此我并不认为utf8更好。我建议使用与工具集相同的宽/薄。对于windows,这通常是wchar\t。对于便携式工具集,通常是字符。如果您打算使用Unicode而根本不支持ANSI,那么为了可读性,您最好使用
CreateWindow
。除此之外,如果由于某种原因,
Unicode
未定义,则代码将中断。我想,如果您要要求字符串是宽的(带有
L
前缀),那么您最好也这样做,并要求API调用也使用宽字符。让一个由
UNICODE
宏控制,而另一个忽略它,对我来说听起来是个坏主意。我认为您应该始终保持显式,或者始终依靠
UNICODE
宏告诉您的任何操作来保持隐式。混用它们是愚蠢的,无论是否定义了UNICODE,您的代码都可能被破坏。我在这里看不到任何真正的额外安全性,只是视觉上的混乱。@jalf:如果编译器的设置错误,我完全可以接受无法编译的代码。我会使用
CreateWindow(L“HI”)的可读性,它将使用Unicode,或者提醒我忘记设置
Unicode
定义。@MooingDuck:你肯定不应该说
CreateWindow(L“HI”)
——这是两个世界中最糟糕的!它既不提供兼容性,也不提供可移植性。使用
CreateWindow(\u T(“HI”)
或使用
CreateWindowW(L“HI”)
,但不要混用和匹配。我不想编写独立于字符类型的代码。我该怎么办?@David:在凯尔的例子中,他使用的框架是使用宏的windowsapi。你在用什么框架编码?@Mooing Duck为了这个论点,我在用Windows API编码,它不需要
\T
文本
宏。@DavidHeffernan:它不需要宏,但它是为与宏一起使用而设计的。所以与其与之抗争,不如随它去。@Mehrdad它不是为他们设计的。提供它们的目的是为了简化可同时针对ANSI和Unicode的单一源代码的开发。根据问题,如果您只针对Unicode,则不需要它们。