2012-10-25 35 views
1

背景:字符串文字前綴創建NULL(0)

我工作的一個Web應用程序的遺留代碼,我現在把一些代碼來UNICODE的ASCII部分。我遇到了記錄器中的以下錯誤。似乎字符串文字不是創建的,就是因爲某種原因而被破壞。

以下字符串示例 - "%s::%s - Started with success."在內存中,它看起來像這樣。

2AF9BFC 25 00 73 00 3A 00 3A 00 %.s.:.:. 
02AF9C04 25 00 73 00 20 00 2D 00 %.s. .-. 
02AF9C0C 20 00 53 00 74 00 61 00 .S.t.a. 
02AF9C14 72 00 74 00 65 00 64 00 r.t.e.d. 
02AF9C1C 20 00 77 00 69 00 74 00 .w.i.t. 
02AF9C24 68 00 20 00 73 00 75 00 h. .s.u. 
02AF9C2C 63 00 63 00 65 00 73 00 c.c.e.s. 
02AF9C34 73 00 2E 00 00 00 00 00 s....... 
02AF9C3C 00 00 00 00 00 00 00 00 ........ 

在日誌中的字符串看起來如下-_S_t_a_r_t_e_d_ _w_i_t_h _s_u_c_c_e_s_s 如果空間在這裏表示像往常一樣和NULL字符是_(_的僅僅是一個例子來表示,不同的TXT編輯器將顯示它以不同的方式)。

我確實使用了_T宏,它將字符串替換爲我學習的Unicode。

爲什麼我會得到字節0前綴?

+1

你確定它不是字符串'L「%s ::%s - 開始成功。 (仔細看文檔) –

+0

這完全正常,這就是用utf-16編碼的字符串。拋出一些中文字符來看看別的不是0的東西。你可以通過添加一個BOM來將任何程序用於更聰明地查看文本,並將0xfeff寫入文件的開頭。 –

+0

@ R.MartinhoFernandes就像我剛纔提到的那樣,字符串的前綴是_T宏,它確實被替換爲L – qballer

回答

1

在Microsoft的術語中,「Unicode」表示UTF-16,即每個字符由一個或兩個16位code units表示。當一個ASCII字符被轉換爲一個UTF-16時,它將被表示爲一個單一的代碼單元,高字節零和低字節包含ASCII字符。

如果您希望您的日誌文件可以ASCII格式讀取,那麼在寫出時需要將文本轉換爲UTF-8。否則,請確保日誌文件中的所有文本都是UTF-16並使用瞭解UTF-16的日誌文件讀取器,但請注意,如果大部分文本都是ASCII,則會浪費多達50%的空間(因爲每秒字節將是0)。

+1

更確切地說,如果您希望日誌文件作爲ASCII可讀,您需要將文本轉換爲ASCII。 –

+0

你知道windows的UTF-8是什麼嗎? – qballer

+1

@qballer您可以使用['WideCharToMultiByte'](http://msdn.microsoft.com/en-us/library/dd374130%28VS.85%29.aspx),並使用'CodePage'作爲'CP_UTF8'。 – ecatmur