Unicode与多字节

时间:2010-02-09 03:17:10

标签: c unicode visual-c++ multibyte

我对这个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吗?特别是如果我逐个字符地读它,即通过递增字符指针?

谢谢。

此致 莱恩

3 个答案:

答案 0 :(得分:4)

首先,如果您使用UNICODE / _UNICODE进行编译并且不打算定位其他平台,则可以避免使用TCHAR商家并使用WCHAR (或wchar_t)和W在任何地方都有作用。

  

1)所有'char'都会被解释为宽字符吗?

根据定义,C中的

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家族,除了我可以推测它们的工作方式与上面的定义相同。也就是说,tprintfTCHAR作为参数并依赖于UNICODE设置,或者将它们视为charwchar_t s。

  

3)如果我有一个文本文件(以默认格式保存,即不更改使用的默认字符集)我想要读入缓冲区,我仍然可以使用char而不是TCHAR吗?特别是如果我逐个字符地读它,即通过递增字符指针?

对文件的内容进行编码的字符完全由其自身决定,与TCHAR无关。 TCHAR用于文件名,您可以在win32 API调用中使用。

答案 2 :(得分:0)

  

说我正在用Unicode编译我的程序(但最终,我想要一个独立于所用字符集的解决方案。)

这取决于你的语言 - 就像编程语言而不是人类口头语言一样。 “用Unicode编译我的程序”是什么意思?

  1. 是否所有'char'都被解释为宽字符?

    • 这取决于所选择的语言和选项。例如,Java使用16位字符(存储UTF-16或UCS-2 - 很久以前它曾是UCS-2,但我认为它现在是UTF-16)。在C中,你必须努力工作才能将基本的“char”类型解释为8位数量以外的任何其他类型 - 至少在基于Unix的编译器上。
  2. 如果我有一个简单的printf语句,即printf(“Hello World \ n”);如果没有字符串,我可以不使用_tprintf和_T(“...”)吗?如果printf语句包含一个字符串,那么我应该使用_tprintf和_T(“...”),即_tprintf(“Hello%s \ n”,name); ?

    • 这需要对您正在使用的平台有所了解,因为它远非标准。我怀疑这是MSVC ...因为我不使用MSVC,所以我更难以获得权威。但是,ISO C99标准(MSVC信号不支持)提供了诸如fwprintf()之类的功能来打印宽字符串。如果您需要有关特定编译器的信息,请使用正确的信息标记您的问题。
  3. 如果我有一个文本文件(以默认格式保存,即不更改使用的默认字符集)我想要读入缓冲区,我仍然可以使用char而不是TCHAR吗?特别是如果我逐个字符地读它,即通过递增字符指针?

    • 同样,TCHAR不是标准的 - 它对MSVC非常具体。在标准C中,当您对其应用适当的函数时,文件流会获取“方向”(面向广义或面向字节)。它保持在该方向,直到它关闭(或用freopen()重新打开)。