2013-08-26 51 views
1

嗨,我是完全新的數據庫。在這裏,我有問題在表格中插入一行。該字符串以Unicode編碼並使用WideCharToMultiByte調用轉換爲UTF8。然後構建如下的數據庫查詢。火鳥崩潰'UTF8字符串轉換爲wstring'

in = "Weiß" (UTF8 string result of conversion from Unicode to UTF8) 


wchar_t buf[2048]; //= new wchar_t[ in.size() ]; 
size_t num_chars = mbstowcs(buf, in.c_str(), in.size()); 
wstring ws(buf, num_chars); 

在這裏,我有串ws = 'WeiÃ'如果我擴大WS看到有字符串中的5個字符和5個字符是159:L''

wostringstream oss; 
oss << L"insert into myutftable values(" 
             << id 
             << L"', '" 
             << ws 
             << L") "; 

然後我用SQLExecDirect來更新數據庫。這是我看到墜機的地方。

我想知道它爲什麼崩潰。我嘗試了幾件不成功的事情。我用character set = utf8但沒有運氣。任何人都可以告訴我什麼可能是崩潰的原因,以及如何解決?

順便說一句我正在使用Firebird數據庫版本2.0。

UPDATE1:

1)如果我不轉換UTF8字符串wstring的,並使用SQLExecDirectA調用它工作正常。但在這一點上,我不知道副作用,因爲該數據庫一直在其他地方訪問。

2)我曾嘗試從命令行使用isql.exe推送相同的字符串,沒有問題!

我不知道爲什麼在我的調試器的觀察名單是沒有顯示的最後一個字符(Ÿ這個字符轉換爲WCHAR顯示爲159:L''後,我看了字符集159指Ÿ。任何想法,爲什麼我的調試器不顯示此字符作爲WCHAR,但它顯示爲剛剛字符?

有沒有辦法來調試SQLExecDirect?我使用OdbcJdbc驅動程序。

Update 2: 好像我有問題我的字符串中有個字符。只要我發送字符串沒有問題,如果我使用wstring的話,它就會失敗。

我只是在內存中觀察到,當我與SQLExecDirectA發送它作爲9f(= Y)沒有問題,如果我把它作爲9f 00(= Y WCHAR)它是如何代表則崩潰於SQLExecDirect

我的應用程序是使用Unicode字符集建立的。 Firebird數據庫字符集設置爲無。

任何想法??

+2

我不認爲'刪除[] buf'會是明智的考慮你永遠不會'新'它。只是......哎喲。在那些未定義行爲的小寶石之後,指望你的堆被洗淨。 pebkac。 – WhozCraig

+0

我同意,我的代碼中再也沒有這個電話了。 – Vivek

+1

隨着'崩潰',你的意思是一個Firebird服務器崩潰,連接關閉,或在您的應用程序崩潰? –

回答

4

mbstowcs將其第二個參數假定爲系統默認代碼頁中的字符串,也稱爲CP_ACP,它永遠不會是UTF-8(也稱爲CP_UTF8)。

WideCharToMultiByte的倒數是MultiByteToWideChar。雖然目前還不清楚爲什麼要將字符串從Unicode轉換爲UTF-8,但只是將其轉換回來。