字符串文字是使用前缀 NULL (0) 创建的
Posted
技术标签:
【中文标题】字符串文字是使用前缀 NULL (0) 创建的【英文标题】:String literals are created with prefix NULL (0) 【发布时间】:2012-10-25 10:03:46 【问题描述】:背景:
我正在处理 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 宏,它将字符串替换为 Unicode,我从 here 学到的知识。
为什么我会得到字节 0 前缀?
【问题讨论】:
你确定不是字符串L"%s::%s - Started with success."
? (仔细查看文档)
这完全正常,这就是 utf-16 编码的字符串的样子。输入一些汉字以查看除 0 之外的其他内容。通过添加 BOM,将 0xfeff 写入文件的开头,您可以使用于查看文本的任何程序更智能。
@R.MartinhoFernandes 就像我提到的字符串以 _T 宏为前缀,它确实被替换为 L
【参考方案1】:
在 Microsoft 的术语中,“Unicode”表示UTF-16,即每个字符由一个或两个 16 位 code units 表示。当 ASCII 字符转换为 UTF-16 时,它将被表示为单个代码单元,其中高字节为零,低字节包含 ASCII 字符。
如果您希望您的日志文件以 ASCII 格式可读,您需要在写出时将文本转换为 UTF-8。否则,请确保日志文件中的所有文本都是 UTF-16 并使用理解 UTF-16 的日志文件阅读器,但请注意,如果您的大部分文本是 ASCII(因为每秒字节将为 0)。
【讨论】:
更准确地说,如果您希望日志文件以 ASCII 格式可读,则需要将文本转换为 ASCII。 你知道windows中的UTF-8是什么吗? @qballer 你可以使用WideCharToMultiByte
和CodePage
作为CP_UTF8
。以上是关于字符串文字是使用前缀 NULL (0) 创建的的主要内容,如果未能解决你的问题,请参考以下文章