std :: string,std :: wstring和UTF8

时间:2016-01-31 22:11:34

标签: c++ string utf-8

我想使用UTF-8编码的字符串(对不起,如果措辞不好,请纠正我,以便我理解什么是正确的)。另外,我希望我的程序是跨平台的。

IIUC,正确的方法是使用std :: wstring,然后将其转换为UTF8。问题是我认为在Linux上std :: string已经用UTF8编码了(我可能错了)。

那么用尽可能少的条件代码创建std :: {w}字符串的UTF8表示的最佳方法是什么?

字符串是常量,它们是硬编码的,它们将在SQLite查询中使用。

P.S。:我将尝试使用XCode 5,希望它符合C ++ 11标准。

3 个答案:

答案 0 :(得分:4)

  

它们是硬编码的。

如果所讨论的所有字符串都是硬编码的字符串文字,那么您就不需要任何特殊字符串了。

在声明此类字符串时,请使用u8前缀,以确保它们以UTF-8编码。在支持C ++ 11此功能的每个平台上。这种字符串的类型是const char [],就像常规字符串文字一样:

const char my_utf8_literal[] = u8"Some String.";

当然,这些也可以存储在std::string(不是wstring)中:

std::string my_utf8_string = u8"Some String.";

你说你的目标是在SQLite查询和命令中使用它们。在这种情况下,让一切工作都应该很容易。您将使用SQLite的字符串格式化命令来构建查询,虽然它们对UTF-8视而不见,但只要您的所有输入都是UTF-8,输出也将是有效的UTF-8。所以不应该有任何问题。

答案 1 :(得分:0)

对于UTF-8处理,有一个名为tiny-utf8的库。它为std :: string提供了一个替代品,或者更具体地说是std :: u32string(:: value_type是char32_t,但是数据表示是带有char的utf8)。这或多或少是在C ++ 11中处理utf8的最简单方法。

  

字符串是常量,它们是硬编码的,它们将被使用   在SQLite查询中。

如果您有硬编码字符串,则只需将源文件的编码更改为UTF8,并将U - 前缀添加到字符串文字中,然后使用该字符串文字构造utf8_string上课。

  

那么创建UTF8表示的最佳方法是什么?   std :: {w}字符串的条件代码最少?

恕我直言如果您能够,请不要使用wchar_t和wstring,因为它们可能是C ++字符串库中最模糊指定和特定于平台的内容。

我希望这至少有一点帮助。

干杯,雅各布

答案 2 :(得分:-2)

发布此答案后问题已更改,并补充说字符串是要在SQL查询中使用的硬编码文字。对于那个简单的u8字符串是一个简单的解决方案,这里回答的部分变得无关紧要。我不会通过这个或进一步的变化来追逐这个问题。

RE

  

我想使用UTF-8编码的字符串(对不起,如果措辞不好,请纠正我,以便我理解什么是正确的)。另外,我希望我的程序是跨平台的。

然后你很幸运。

Microsoft的文档明确声明他们的setlocale不支持UTF-8:

MSDN docs on setlocale:

  

可用的区域设置名称,语言,国家/地区代码和代码页的集合包括Windows NLS API支持的所有内容,但每个字符需要两个以上字节的代码页除外如UTF-7和UTF-8。如果您提供的代码页值为UTF-7或UTF-8,则setlocale将失败,返回NULL

单挑:尽管它不起作用,并且明确记录为不起作用,但有许多网站和博客,甚至书籍,推荐这种方法,在某种鸵鸟中 - 喜欢的方式。他们往往看起来很权威。但信息是垃圾。

RE

  

使用最少的条件代码创建std :: {w}字符串的UTF8表示形式的最佳方法是什么?

这取决于你有什么。标准库提供std::codecvt。之前有人问过并回答过,例如(Convert wstring to string encoded in UTF-8)。