6

我想在 Linux 中开发一个应用程序。我想使用 wstring 因为我的应用程序应该支持 unicode 而我不想使用 UTF-8 字符串。

在 Windows 操作系统中,使用 wstring 很容易。因为任何 ANSI API 都有 unicode 形式。例如有两个 CreateProcess API,第一个 API 是 CreateProcessA,第二个 API 是 CreateProcessW。

wstring app = L"C:\\test.exe";
CreateProcess
(
  app.c_str(), // EASY!
  ....
);

但是在 Linux 中使用 wstring 似乎很复杂!例如,Linux 中有一个名为parport_open的 API (它只是一个示例)。

而且我不知道如何将我的 wstring 发送到这个 API(或像 parport_open 这样接受字符串参数的 API)。

wstring name = L"myname";
parport_open
(
  0, // or a valid number. It is not important in this question.
  name.c_str(), // Error: because type of this parameter is char* not wchat_t*
  ....
);

我的问题是如何在 Linux API 中使用 wstring(s)?

注意:我不想使用 UTF-8 字符串。

谢谢

4

2 回答 2

5

几乎每个发行版上的 Linux API(在最近的内核上并具有正确的语言环境设置)默认使用 UTF-8 字符串1。你也应该在你的代码中使用它们。抵抗是徒劳的。

仅当 Unicode 限制为 65536 个字符(即用于 UCS-2)时,Windows 上的wchar_t(因此)才方便,现在 16 位 Windows用于 UTF-16,1 = 1 Unicode 字符的优势很长消失了,所以你也有使用 UTF-8 的缺点。如今恕我直言,Linux方法是最正确的。(我关于 UTF-16 的另一个答案以及 Windows 和 Java 使用它的原因wstringwchar_twchar_twchar_t

顺便说一句,两者string都不wstring是编码感知的,因此您不能可靠地使用这两者中的任何一个来操作 Unicode 代码点。我从 wxWidgets 工具包中听说可以wxString很好地处理 UTF-8,但我从未对它进行过广泛的研究。


  1. 实际上,正如下面所指出的,内核的目标是与编码无关,即将字符串视为(NUL 终止?)字节的不透明序列(这就是为什么不能使用像 UTF-16 这样的“更大”字符类型的编码用过的)。另一方面,无论在哪里进行实际的字符串操作,都使用当前的语言环境设置,并且在几乎所有现代 Linux 发行版上默认设置为 UTF-8(这对我来说是一个合理的默认设置)。
于 2011-09-04T14:17:27.400 回答
0

我不想使用 UTF-8 字符串。

好吧,您需要克服这种不情愿,至少在调用 API 时是这样。Linux 使用单字节字符串编码,总是 UTF-8。显然,您应该使用单字节字符串类型,因为您显然不能将宽字符传递给期望char*. 使用string而不是wstring.

于 2011-09-04T14:20:06.820 回答