13

我真的对这个 unicode 与多字节的东西感到困惑。

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

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

2) 如果我有一个简单的 printf 语句,即 printf("Hello World\n"); 没有字符串,我可以不使用 _tprintf 和 _T("...") 吗?如果 printf 语句包含字符串,那么我应该使用 _tprintf 和 _T("..."),即 _tprintf("Hello %s\n", name); ?

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

谢谢你。

问候,雷恩

4

3 回答 3

4

首先,如果您使用UNICODE/进行编译_UNICODE并且不打算针对其他平台,则可以避免使用TCHAR业务并在任何地方使用WCHAR(或wchar_t)和 W 功能。

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

char在 C 中——根据定义——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,然后基于此做出决定。

于 2010-02-09T04:16:04.957 回答
2

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

不,但是所有TCHAR的 s 都将被解释为wchar_ts

考虑一下 winnt.h 可能会如何指定:

#ifdef UNICODE
 typedef WCHAR TCHAR;
#else
 typedef CHAR TCHAR;
#endif

当您调用SomeApi()它时,它将换行到SomeApiA(char *arg)SomeApiW(wchar_t *arg)。(论点实际上是TCHAR's,但你明白了)。

因此,您的源代码将是“独立的”,因为它可以编译成“ANSI”或 Widechar 版本。为此,您需要使用TCHAR's 而不是原始类型。

2) 如果我有一个简单的 printf 语句,即 printf("Hello World\n"); 没有字符串,我可以不使用 _tprintf 和 _T("...") 吗?如果 printf 语句包含字符串,那么我应该使用 _tprintf 和 _T("..."),即 _tprintf("Hello %s\n", name); ?

tprintf除了我可以推测他们以与上述定义相同的方式工作外,我不知道这个家庭。也就是说,tprintfTCHAR's 作为参数并根据UNICODE设置将它们视为chars 或wchar_ts。

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

文件内容使用什么字符编码完全取决于它自己,与TCHAR's无关。TCHAR's 用于文件名,以便您在 win32 API 调用中使用。

于 2010-02-09T13:01:50.587 回答
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()
于 2010-02-09T03:37:38.930 回答