我想使用UTF-8编码的字符串(对不起,如果措辞不好,请纠正我,以便我理解什么是正确的)。另外,我希望我的程序是跨平台的。
IIUC,正确的方法是使用std :: wstring,然后将其转换为UTF8。问题是我认为在Linux上std :: string已经用UTF8编码了(我可能错了)。
那么用尽可能少的条件代码创建std :: {w}字符串的UTF8表示的最佳方法是什么?
字符串是常量,它们是硬编码的,它们将在SQLite查询中使用。
P.S。:我将尝试使用XCode 5,希望它符合C ++ 11标准。
答案 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:
“可用的区域设置名称,语言,国家/地区代码和代码页的集合包括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)。