背景:
我正在研究Web应用程序的遗留代码,我目前正在将代码的一些ASCII部分转换为UNICODE。我在记录器中遇到了以下错误。似乎字符串文字要么被创建,要么在某种程度上被破坏了。
以下字符串示例 - "%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宏,它将字符串替换为我学习的here字符串。
为什么我得到字节0的前缀?
答案 0 :(得分:1)
在Microsoft的术语中,“Unicode”表示UTF-16,即每个字符由一个或两个16位code units表示。当ASCII字符转换为UTF-16时,它将表示为单个代码单元,高字节为零,低字节包含ASCII字符。
如果您希望您的日志文件可以作为ASCII读取,则需要在将其写入时将文本转换为UTF-8。否则,请确保日志文件中的所有文本都是UTF-16并使用了解UTF-16的日志文件阅读器,但请注意,如果您的大部分文本都是ASCII,则会浪费高达50%的空间(因为每秒都有) byte将为0)。