【问题标题】:MSVC 2010 and UTF8MSVC 2010 和 UTF8
【发布时间】:2016-02-07 03:35:29
【问题描述】:

所有,

我的项目使用 MSVC 2010 和 SQLite 的最新代码。

根据 SQLite 文档,查询字符串应编码为 UTF-8。

根据此处其他一些线程的建议,我尝试使用 u8"" 前缀。

但是,我收到“u8”无法识别的错误:'u8': undeclared identifier

那么,现在有两个问题:

  1. u8 只有 C++11 吗?

  2. 如何让我的项目识别 u8 前缀?

谢谢。

【问题讨论】:

  • 不知道你从哪里得到 SQLite 需要 UTF-8 的想法。我在 SQLite C API 中看到的所有接受字符串参数的函数也都有 UTF-16 版本。
  • @MrEricSir,如果表名中有一些 Unicode 字符,我的查询字符串最好编码为 UTF-8。
  • “最好编码为 UTF-8”是什么意思? UTF-16 和 UTF-8 编码的字符没有区别。
  • @MrEricSir,我的意思是,如果表名或字段名是Unicode,则查询字符串应根据SQLite进行UTF-8编码。

标签: c++ sqlite utf-8


【解决方案1】:

u8 字符串前缀确实是 C++11 或更高版本。

但是,除非您的字符串文字实际上包含非拉丁字符,U+0x0080 及更高版本,否则没有任何区别。

【讨论】:

  • 文字字符串不会。但是,如果我从 SQLite 获取表名是 UTF-8 并将其推送到非 UTF-8 字符串中,结果会是什么?
  • @Igor 什么都没有。一个肮脏的小秘密是没有“UTF-8”字符串或“非 UTF-8”字符串这样的东西。字符串是字符串。字符串包含表示字符的字节。 UTF-8 是一种将 unicode 字符编码为字节序列的机制。 u8"À" 和 "\xc3\x80" 产生相同的字符串对象,一个无法区分。
  • 我明白了。问题是,如果我有一个将由 MSVC 编译的标准 std::string,那么我的表名或表字段将被编码为 UTF-8。我将以 UTF-8 格式将此表名附加到 std::string 查询,并将其传递回需要 UTF-8 编码查询字符串的 SQLite。怎么了?不幸的是我无法测试它......
  • @Igor 当然你可以测试它。如果您希望拥有成功的职业并以计算机程序员的身份谋生,那么您别无选择,只能学习如何测试您的代码。
  • 我确实知道如何测试。看起来我需要在 SQLite 命令行界面中提供一个 Unicode 字符,我怀疑如果不安装对亚洲语言的适当支持,我可以做到这一点。问题是 - 我宁愿避免在我的开发机器上安装一些东西,因为我仍在开发中。
【解决方案2】:

Visual C 2010 似乎不支持这些前缀。不过,您应该能够只在文字中包含 UTF-8 字符串,因为它们不违反以空字符结尾的字符串的规则。字符串函数可能有些奇怪,它们可以处理 UTF-8 字符串,但它们会将它们解释为单字节序列而不是 UTF-8 字符,因此比较、大小写转换等不会像预期的那样工作.您需要更新版本的 Visual Studio 才能彻底解决这些问题。

另外,检查#pragma execution_character_set("utf-8") 的效果。它仅在 Visual Studio 中的 C++ 中可用,因此您可能必须将 C 源文件编译为 C++ 才能访问它。

【讨论】:

  • 我的项目是 C++,问题被标记为 C++。
  • 那么你应该对编译指示没问题。至于 SQLite,只要字符串的内容是 UTF-8,它就不会在意编译器不理解 UTF-8。只要字符串没有任何嵌入的空字符(UTF-8 没有),您的 C/C++ 代码就会被忽略,它只是字节。
  • 字符串是 "std::string query1 = "SELECT ... FROM....";";我相信它最后不带有 ;\0' 符号。另外,我相信这个#pragma 仅适用于 MSVC,对吗?
  • 是的。仅限 MSVC,并且可能特定于 Visual Studio 2010,因为更高版本支持标准前缀。 std::string 在其内部表示中可能有也可能没有 '\0',具体取决于它的实现方式,c_str() 方法(如果您需要 C 字符串形式,则应使用该方法)将产生一个以 null 结尾的 C 字符串.
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多