C# SQLite Windows Phone字符编码不工作
我正在开发一个Windows Phone 8.1应用程序,该应用程序使用SQLite数据库来存储本地化字符串。我使用SQLite for Windows Phone 8.1扩展来实现这一点,我正在用C编程。但是,当我在数据库中存储本地化字符串时,像“å”、“ö”等特殊字符显示为�' 在SQLite数据库中 我已经尝试了以下方法: 1将C字符串转换为UTF-8、UTF-16或Unicode,然后再将其存储在数据库中,无需任何帮助。似乎用C编码字符串是无用的 2将SQLite数据库设置为使用UTF-16编码,PRAGMA编码=UTF-16;创建数据库时。pragma已正确处理,但特殊字符仍为'�'. 我的假设是,SQLite的C++代码中有一些错误,对于Windows Phone 8.1扩展。 将本地化字符串存储在其他位置不是一个选项,因此如何获得SQLite for Windows Phone 8.1扩展以正确存储特殊字符 C代码:C# SQLite Windows Phone字符编码不工作,c#,sqlite,encoding,windows-phone-8.1,C#,Sqlite,Encoding,Windows Phone 8.1,我正在开发一个Windows Phone 8.1应用程序,该应用程序使用SQLite数据库来存储本地化字符串。我使用SQLite for Windows Phone 8.1扩展来实现这一点,我正在用C编程。但是,当我在数据库中存储本地化字符串时,像“å”、“ö”等特殊字符显示为�' 在SQLite数据库中 我已经尝试了以下方法: 1将C字符串转换为UTF-8、UTF-16或Unicode,然后再将其存储在数据库中,无需任何帮助。似乎用C编码字符串是无用的 2将SQLite数据库设置为使用UTF-
public IEnumerable<IDictionary<string,object>> ExecuteQuery(string query)
{
lock (LockObject)
{
var sqCommand = new SQLiteCommand(_sqLiteConnection) { CommandText = query };
return sqCommand.ExecuteQueryEx();
}
}
以及SQLiteCommand.ExecuteQueryEx代码:
public IEnumerable<IDictionary<string,object>> ExecuteQueryEx()
{
if (_conn.Trace)
{
Debug.WriteLine("Executing Query: " + this);
}
var result = new List<Dictionary<string,object>>();
var stmt = Prepare();
while (SQLite3.Step(stmt) == SQLite3.Result.Row)
{
var columnCount = SQLite3.ColumnCount(stmt);
var row = new Dictionary<string,object>();
for (var i = 0; i < columnCount; i++)
{
var columnName = Marshal.PtrToStringAnsi(SQLite3.ColumnName(stmt, i));
var columnType = SQLite3.ColumnType(stmt, i);
var value = ReadColEx(stmt, i, columnType);
row.Add(columnName, value);
}
result.Add(row);
}
Finalize(stmt);
return result;
}
似乎可以使用以下解决方案解决此问题: 使用这种技术,我添加了一个带有特殊Prepare2方法的部分SQLiteCommand类,以将CommandText字符串转换为UTF8字节数组:
[DllImport("sqlite3", EntryPoint = "sqlite3_prepare_v2", CallingConvention = CallingConvention.Cdecl)]
private static extern SQLite3.Result Prepare2(IntPtr db, byte[] queryBytes, int numBytes, out IntPtr stmt, IntPtr pzTail);
private Sqlite3Statement Prepare2()
{
IntPtr statement;
var queryBytes = System.Text.Encoding.UTF8.GetBytes(CommandText);
var result = Prepare2(_conn.Handle, queryBytes, queryBytes.Length, out statement, IntPtr.Zero);
if (result != SQLite3.Result.OK)
{
throw SQLiteException.New(result, SQLite3.GetErrmsg(_conn.Handle));
}
BindAll(statement);
return statement;
}
问题代码示例中的“Prepare”方法被这个新的“Prepare2”方法所取代,现在,特殊字符正确地出现在SQLite数据库中。共享您的代码以获得更好的答案和指导。
[DllImport("sqlite3", EntryPoint = "sqlite3_prepare_v2", CallingConvention = CallingConvention.Cdecl)]
private static extern SQLite3.Result Prepare2(IntPtr db, byte[] queryBytes, int numBytes, out IntPtr stmt, IntPtr pzTail);
private Sqlite3Statement Prepare2()
{
IntPtr statement;
var queryBytes = System.Text.Encoding.UTF8.GetBytes(CommandText);
var result = Prepare2(_conn.Handle, queryBytes, queryBytes.Length, out statement, IntPtr.Zero);
if (result != SQLite3.Result.OK)
{
throw SQLiteException.New(result, SQLite3.GetErrmsg(_conn.Handle));
}
BindAll(statement);
return statement;
}