将UTF-8字符C#发送到C无法正常工作

时间:2012-12-14 18:27:27

标签: c# sqlite utf-8 com-interop

我使用SQLite for C.我尝试从c#app向.dll发送UTF-8 Chars,但每次它的工作都不同。例如,有时它添加“değirmenci”和另一次使用相同的代码添加“değirmencil”,但我不改变这个词。有时候它会在UNIQUE列中添加相同内容(我认为它有一个字符,但它在ascii中不像0x01那样可见) 抱歉我的英文。

这是我的c#代码;

    [DllImport("dllfile.dll", CharSet = CharSet.Unicode)]

static void Main()
{
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes("değirmenci");
    int r;
    //
    IntPtr unmanagedPointer = Marshal.AllocHGlobal(bytes.Length);
    Marshal.Copy(bytes, 0, unmanagedPointer, bytes.Length);

    IntPtr ch = Tahmin_Baslat();

    r = Sozcuk_Ekle(unmanagedPointer);
    Console.WriteLine(r);
    Console.Read();
    //
}

这是我的C代码

    int Sozcuk_Ekle(const char* kok,int tip_1=1,int tip_2=0,int tip_3=0)
{
    sqlite3 *ch; 
    int rc; 
    char *HataMsj = 0; 

    rc = sqlite3_open(veritabani, &ch); // Veritabanının açılması

    if( rc )
    {
        return HATA_DEGERI;
    }

    char buff[strlen(kok) + 64];
    sprintf(buff,"INSERT INTO kokler (kok,tip_1,tip_2,tip_3) VALUES('%s',%d,%d,%d)",kok,tip_1,tip_2,tip_3); // Verilerin Birleştirilmesi
    sqlite3_exec(ch,buff,GeriBildirim,0,&HataMsj); // Komutun Yürütülmesi
    sqlite3_close(ch); // Veritabanını kaynaklarının serbest bırakılması
    return DOGRU_DEGERI; // Doğru Dönder
}

(包括头文件等) 它是怎么回事: http://i.stack.imgur.com/BJ4fE.png

解决方案
将NULL终止符添加到字节的末尾。 byte [] bytes = System.Text.Encoding.UTF8.GetBytes(“değirmenci\ 0”);像这样。

1 个答案:

答案 0 :(得分:1)

检查 DllImport 属性中的calling convention(应为 Cdecl )。并在UTF-8字符串中添加一个NULL终止符:

byte[] bytes = System.Text.Encoding.UTF8.GetBytes("değirmenci" + '\0');

这将为结果 UTF-8字符串添加NULL终止符(本机.NET字符串不需要该字符串)。