在VC++中如何使用Unicode字符串呢?当然,你应该定义#define UNICODE,但是对于你的字符串来说呢?
是否应该在所有的文本周围使用TEXT()或_T()宏,还是只要在字符串前面加上L即可?我相信现在所有程序都应该使用Unicode,所以使用L前缀会更清晰吧。
你有什么看法呢?
在VC++中如何使用Unicode字符串呢?当然,你应该定义#define UNICODE,但是对于你的字符串来说呢?
是否应该在所有的文本周围使用TEXT()或_T()宏,还是只要在字符串前面加上L即可?我相信现在所有程序都应该使用Unicode,所以使用L前缀会更清晰吧。
你有什么看法呢?
这取决于您想要实现什么目标。如果您希望确保您的代码可以在Unicode和非Unicode环境下编译和正常工作,可以使用TEXT
或_T
宏,并调用“默认”的Win32函数名称(例如CreateWindow
)。
如果您希望确保您的程序始终使用Unicode API,则应在字符串前面使用L
前缀,并调用Win32函数的广义版本(例如CreateWindowW
)。
后一种情况下,无论是否定义了UNICODE
,都会获得Unicode行为。
在前一种情况下,您的应用程序将根据是否定义了UNICODE
而更改其行为。
我同意您的观点,自Win98以来,非Unicode版本实际上已经不再相关,所以我建议采用第二种方法。
CreateWindow
。 - David HeffernanCreateWindow(L"HI");
,它将使用Unicode,或者提醒我忘记设置UNICODE
定义。 - Mooing DuckCreateWindow(L"HI")
——这是两者最糟糕的结合!它既没有兼容性,也没有可移植性。要么使用CreateWindow(_T("HI"))
,要么使用CreateWindowW(L"HI")
,但不要混用。 - user541686使用L
前缀声明Unicode字符串字面值。
TEXT()
或_T()
宏是为了早期需要单一源代码同时编译Unicode和非Unicode版本的Windows(Windows 9x)。如今可以放心地忽略Windows 9x。
我之前学到的一些东西:
做框架设计的事情 - 如果你使用Windows,使用_T
,使你的代码独立于字符类型。如果你在Linux上,使用UTF-8。如果你有一个跨平台的框架,就按照它的方式去做。但是,除非你有一个非常好的理由,否则不要试图发明自己的东西。(通常来说,与框架对抗的努力往往是不值得的。)
GetWindowText
函数? - David Heffernanwchar_t
与int
的可移植性相同。它不能保证在所有平台上的大小相同,并且其内部表示可能不同,但是使用该类型来存储所需内容的源代码将在所有平台上运行。对于跨平台代码,您仍然需要处理编码转换,因此我不认为utf8更好。 - jalf_T
是微软特有的?tchar.h
看起来与其他任何东西都没有太大关系,可以在任何平台上使用而几乎不需要更改。而且你总是可以重新定义_T
以使用 UTF-8 或其他编码方式,所以我不明白为什么要删除它会有什么问题... - user541686T
或_t
版本,以及_tmain()
。因此……可移植性会受到严重影响。 - Kerrek SB