如何在Linux API中使用wstring?

时间:2011-09-04 14:13:14

标签: c++ linux wstring

我想在Linux中开发一个应用程序。我想使用wstring beacuse我的应用程序应该支持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?

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

由于

2 个答案:

答案 0 :(得分:3)

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

仅当Unicode限制为65536个字符(即wchar_t用于UCS-2)时,Windows上的wstring(以及wchar_t)才是方便的,现在16-位Windows wchar_t用于UTF-16,1 wchar_t = 1 Unicode字符的优势很快就消失了,因此使用UTF-8具有相同的缺点。如今恕我直言,Linux方法是最正确的。 (Another answer of mine on UTF-16 and why Windows and Java use it

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


  1. 实际上,正如下面所指出的,内核的目标是编码不可知,即它将字符串视为(NUL终止的?)字节的不透明序列(这就是为什么使用“较大”字符类型的编码,如UTF- 16不能使用)。另一方面,无论在哪里进行实际的字符串操作,都会使用当前的语言环境设置,默认情况下,几乎所有现代Linux发行版都设置为UTF-8(这对我来说是合理的默认设置)。

答案 1 :(得分:0)

  

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

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