SQLITE UTF-16编码问题

时间:2014-11-30 03:05:58

标签: ios encoding sqlite utf-16 unreal-engine4

好吧,在这个问题上,我已经把头发拉了几天。这里有几种技术在使用,首先我使用虚幻引擎4开发iOS游戏,并且我链接到sqlite3的静态库,我在Windows上创建数据库。

在Windows上一切正常,我创建数据库,如果你做Pragma编码;它显示了UTF-16LE。

然而,当在IOS上时,一切都崩溃了。首先,如果我甚至尝试使用sqlite3_open16函数在iOS中创建一个空数据库,它将在名称的末尾创建一个带有一堆垃圾的数据库,如果我打开它,并执行编译指示编码,它将说UTF -8(没有表的空数据库)。 如果我尝试连接到现有的,我会随机获得成功'有时,我认为这必须再次使用出现在我的字符串末尾的奇怪字符,我怀疑是编码问题。

用于打开数据库的函数是:

bool Open(const TCHAR* ConnectionString)
{
    int32 Result = sqlite3_open16(ConnectionString, &DbHandle);
    return Result == SQLITE_OK;
}

在Windows中可以正常工作但在ios中存在上述问题。

根据他们的文件,他们使用USC-2。从我在sqlite源代码中可以看出,它将使用UTF-16LE。我是否需要做一些事情才能在这两者之间进行转换?或者还有什么我可能会在这里失踪?有没有人有任何想法?我希望有些可能不熟悉UE4的人可能还会有一些猜测。

编辑:我尝试过的一系列事项:

  1. 使用UTF-8函数SQLITE这些似乎可以正常工作。 UE4有一个功能TCHAR_TO_UTF8,并且有效。

  2. 尝试使用Objective C来确保UTF-16LE的编码,这给了我随机的'我上面描述的成功。有时候,我不仅会出现随意使用字符串末尾的奇怪随机文本 - 我现在尝试将数据从数据库中提取出来,它会回复为大多数随机问号' ????& #39;偶尔会有汉字。我用来做这个的功能是:

    const TCHAR* UChimeraSqlDatabase::UTF16_To_PlatformEncoding(FString UTF16EncodedString)
    {
    #if PLATFORM_IOS
        const TCHAR* EncodedString = (const TCHAR *)([[[NSString stringWithFString : UTF16EncodedString] dataUsingEncoding:NSUTF16LittleEndianStringEncoding] bytes]);
    #else
        const TCHAR* EncodedString = *UTF16EncodedString;
    #endif
        return EncodedString;
    }
    
  3. 尝试使用Unreals .AppendChar添加L' \ 0'到字符串的末尾,不包括数字2的方法,没有成功。

1 个答案:

答案 0 :(得分:1)

如果您在调用sqlite3_16时在文件名末尾看到奇怪的字符,则听起来您的UTF16文件名未被NULL终止。

要指定数据库的编码,您实际上可以使用任何sqlite3_open函数创建它,但关键是创建数据库后,必须立即设置编码:

PRAGMA encoding = "UTF-16le";

设置编码后,您无法对其进行更改,因此请确保在创建数据库后首先执行此操作。