Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite-windows平台的首选编码 我开发了Windows的C++应用程序。_C++_Windows_Encoding_Sqlite_Utf 16 - Fatal编程技术网

SQLite-windows平台的首选编码 我开发了Windows的C++应用程序。

SQLite-windows平台的首选编码 我开发了Windows的C++应用程序。,c++,windows,encoding,sqlite,utf-16,C++,Windows,Encoding,Sqlite,Utf 16,我将使用SQLite 3存储: 硬盘上不同文件的路径 GUI界面中的字符串(这些字符串最初可以使用任何编码-英语、西班牙语、中文等) 不同的ASCII字符串 我希望在包含文件路径字符串的列上具有唯一索引。但不是必须的——我可以用我的C++代码来做。 我应该使用什么编码-UTF-8、UTF-16le或UTF-16be 附言。 SQLite有3个打开DB的函数:sqlite3\u open,sqlite3\u open16,sqlite3\u open\u v2。 似乎对于Windows,我必

我将使用SQLite 3存储:

  • 硬盘上不同文件的路径
  • GUI界面中的字符串(这些字符串最初可以使用任何编码-英语、西班牙语、中文等)
  • 不同的ASCII字符串
我希望在包含文件路径字符串的列上具有唯一索引。但不是必须的——我可以用我的C++代码来做。 我应该使用什么编码-UTF-8、UTF-16le或UTF-16be


附言。 SQLite有3个打开DB的函数:
sqlite3\u open
sqlite3\u open16
sqlite3\u open\u v2
。 似乎对于Windows,我必须使用
sqlite3\u open16
,因为路径可能包含非ACSII符号。是吗?

UTF-16le

由于windows API在内部使用此功能,因此如果您使用其他功能,则每个windows API调用都会有转换的开销。如果有很多长字符串的windows API调用,这可能会变得非常重要

在大多数情况下,这不是什么大问题。我建议选择一个,然后把精力和时间集中在其他影响更大的问题上


“对于Windows,我似乎必须使用sqlite3_open16,因为路径可能包含非ACSII符号”


对。这也会将数据库中的defaultencoding设置为UTF16

只需使用默认的UTF-8即可

各种UTF-16编码浪费空间(数据库中绝大多数文本为非ASCII时除外),这需要更多的I/O,这使得一切都变慢。 此外,大多数
16
函数将其参数从UTF-8转换为UTF-8,然后调用使用UTF-8的内部函数,因此它们的速度总是较慢

当名称中包含
16
的函数接收和返回UTF-16字符串时,这与数据库的实际编码无关(所有函数根据需要从UTF-8或UTF-16转换/转换为UTF-8或UTF-16)

没有
16
的函数使用UTF-8,这只是一种不同的编码。在这两种情况下,您可以使用的字符集完全相同,并且SQL的行为始终相同

某些功能(例如,
sqlite3\u open\u v2
)在
16
版本中不可用


只有在由于其他原因而被迫使用UTF-16字符串,并且无论如何都必须转换时,使用
16
函数才有意义。

性能不是问题。我关心数据完整性-不希望获取损坏的数据或由于转换问题导致搜索失败)我发现SQLite内部使用UTF-8并将所有SQL转换为UTF-8的信息。它会影响SQLite功能吗?您不必在Windows上使用
sqlite3\u open16
。如果使用窄字符串API调用之一打开数据库,请确保传递UTF-8编码的文件名。UTF-8和UTF-16可以对相同的字符集进行编码。'设置数据库编码的唯一方法是PRAGMA编码。'不是这样,默认编码是在创建新数据库时确定的。'对于使用sqlite3_open()或sqlite3_open_v2()创建的数据库,默认编码将是UTF-8。'。使用sqlite3_open16()创建的数据库的默认编码将是本机字节顺序的UTF-16。“。关于浪费的空间。西里尔文、中文、日文和印地语字符在UTF-8中比在UTF-16中占用的空间多30%。@rustyx:false,西里尔文在UTF-16和UTF-8中每字符占用2字节。另请参见utf8everywhere.org.Sorry。我正在看即将发布的UTF-8修订版FSS-UTF。由于你提出的这个问题与另一个问题是重复的,但没有回答另一个问题,我不得不对这个答案投反对票。别怪我这样陷害你。去责备你自己吧。