2

OK、私はこの問題について数日間頭を悩ませてきました. ここではいくつかのテクノロジを使用しています。まず、Unreal Engine 4 を使用して iOS ゲームを開発し、Windows 用のデータベースを作成する sqlite3 の静的ライブラリにリンクしています。

Windows ではすべて正常に動作します。データベースを作成します。Pragma エンコーディングを実行すると、UTF-16LEを示しています。

ただし、IOS ではすべてがバラバラになります。まず、iOS で sqlite3_open16 関数を使用して空のデータベースを作成しようとしても、名前の末尾に大量のジャンクを含むデータベースが作成されます。それを開いてプラグマ エンコーディングを実行すると、UTF と表示されます。 -8 (テーブルのない空のデータベース)。既存のものに接続しようとすると、「ランダムに」成功することがあります。これは、エンコードの問題であると思われる文字列の最後に表示される奇妙な文字に関係していると思います。

データベースを開くために使用されている関数は次のとおりです。

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

Windowsでは問題なく動作しますが、iOSでは上記の問題があります。

ドキュメントによると、彼らは USC-2 を使用しています。sqlite ソースでわかることから、UTF-16LE を使用します。これら2つの間で変換するために何かをする必要がありますか? または、ここで見逃している可能性のあるものは他にありますか? 誰にもアイデアはありますか?UE4 に慣れていない人でも推測できることを願っています。

編集:私が試したことのリスト:

  1. UTF-8 関数 SQLITE を使用してください。これらは正常に動作するようです。UE4 には関数 TCHAR_TO_UTF8 があり、それが機能しました。

  2. Objective C を使用して、UTF-16LE のエンコーディングを確実にするようにしてください。これにより、上記で説明した「ランダムな」成功が得られました。文字列の末尾にある奇妙なランダムテキストでランダムにしか機能しないように見えるだけでなく、データベースからデータを取り出そうとすると、ほとんどランダムな疑問符「????」として返されます。ときどき漢字で。これを行うために使用した関数は次のとおりです。

    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 のメソッドを含めずに成功しませんでした。

4

1 に答える 1

1

を呼び出すときにファイル名の末尾に奇妙な文字が表示される場合はsqlite3_16、UTF16 ファイル名がNULL終了していないようです。

データベースのエンコーディングを指定するには、実際にはどのsqlite3_open関数でも作成できますが、重要なのは、データベースが作成されたらすぐにエンコーディングを設定する必要があるということです。

PRAGMA encoding = "UTF-16le";

エンコーディングは一度設定すると変更できないため、データベースを作成した後に必ず最初に行ってください。

于 2014-11-30T03:26:34.073 に答える