我对这个unicode vs multi-byte的事情感到很困惑。
说我正在用Unicode编译我的程序(但最终,我想要一个独立于所用字符集的解决方案。)
1)所有'char'都会被解释为宽字符吗?
2)如果我有一个简单的printf语句,即printf(“Hello World \ n”);如果没有字符串,我可以不使用_tprintf和_T(“...”)吗?如果printf语句包含一个字符串,那么我应该使用_tprintf和_T(“...”),即_tprintf(“Hello%s \ n”,name); ?
3)如果我有一个文本文件(以默认格式保存,即不更改使用的默认字符集)我想要读入缓冲区,我仍然可以使用char而不是TCHAR吗?特别是如果我逐个字符地读它,即通过递增字符指针?
谢谢。
此致 莱恩
答案 0 :(得分:4)
首先,如果您使用UNICODE
/ _UNICODE
进行编译并且不打算定位其他平台,则可以避免使用TCHAR
商家并使用WCHAR
(或wchar_t
)和W在任何地方都有作用。
根据定义,C中的1)所有'char'都会被解释为宽字符吗?
char
是1个字节。 (从技术上讲,它不会在wchar_t
也是1字节的平台上成为“宽字符”,但鉴于您使用的是MSVC并且目标是Windows平台,情况并非如此。 )
因此,出于实际目的,答案是:否。
2)如果我有一个简单的printf语句,即printf(“Hello World \ n”);如果没有字符串,我可以不使用_tprintf和_T(“...”)吗?如果printf语句包含一个字符串,那么我应该使用_tprintf和_T(“...”),即_tprintf(“Hello%s \ n”,name); ?
如果要打印ASCII字符串文字,可以继续使用printf
。
如果您打印的任意字符串可能超出ASCII范围,则应使用_tprintf
(或wprintf
)。
3)如果我有一个文本文件(以默认格式保存,即不更改使用的默认字符集)我想要读入缓冲区,我仍然可以使用char而不是TCHAR吗?特别是如果我逐个字符地读它,即通过递增字符指针?
什么是“默认格式”?
当您在外部文件中阅读时,您应首先读取前几个字节以检查UTF-16或UTF-8 BOM,然后根据该决定做出决定。
答案 1 :(得分:2)
1)所有'char'都会被解释为宽字符吗?
没有。但所有TCHAR
都将被解释为wchar_t
s
考虑winnt.h可能如何指定:
#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef CHAR TCHAR;
#endif
当您致电SomeApi()
时,它将换行至SomeApiA(char *arg)
或SomeApiW(wchar_t *arg)
。 (论证实际上是TCHAR
的,但你明白了。)
所以你的源代码将是“独立的”,因为它可以编译成“ANSI”或Widechar版本。为此,您需要使用TCHAR
而不是基本类型。
2)如果我有一个简单的printf语句,即printf(“Hello World \ n”);如果没有字符串,我可以不使用_tprintf和_T(“...”)吗?如果printf语句包含一个字符串,那么我应该使用_tprintf和_T(“...”),即_tprintf(“Hello%s \ n”,name); ?
我不知道tprintf
家族,除了我可以推测它们的工作方式与上面的定义相同。也就是说,tprintf
将TCHAR
作为参数并依赖于UNICODE
设置,或者将它们视为char
或wchar_t
s。
3)如果我有一个文本文件(以默认格式保存,即不更改使用的默认字符集)我想要读入缓冲区,我仍然可以使用char而不是TCHAR吗?特别是如果我逐个字符地读它,即通过递增字符指针?
对文件的内容进行编码的字符完全由其自身决定,与TCHAR
无关。 TCHAR
用于文件名,您可以在win32 API调用中使用。
答案 2 :(得分:0)
说我正在用Unicode编译我的程序(但最终,我想要一个独立于所用字符集的解决方案。)
这取决于你的语言 - 就像编程语言而不是人类口头语言一样。 “用Unicode编译我的程序”是什么意思?
是否所有'char'都被解释为宽字符?
如果我有一个简单的printf语句,即printf(“Hello World \ n”);如果没有字符串,我可以不使用_tprintf和_T(“...”)吗?如果printf语句包含一个字符串,那么我应该使用_tprintf和_T(“...”),即_tprintf(“Hello%s \ n”,name); ?
fwprintf()
之类的功能来打印宽字符串。如果您需要有关特定编译器的信息,请使用正确的信息标记您的问题。如果我有一个文本文件(以默认格式保存,即不更改使用的默认字符集)我想要读入缓冲区,我仍然可以使用char而不是TCHAR吗?特别是如果我逐个字符地读它,即通过递增字符指针?
freopen()
重新打开)。