Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
C# SQLite Windows Phone字符编码不工作_C#_Sqlite_Encoding_Windows Phone 8.1 - Fatal编程技术网

C# SQLite Windows Phone字符编码不工作

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-

我正在开发一个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代码:

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;
}