怎样区分一个缓冲区中存的是ANSI字符串还是UNICODE字符串

star19678051 2011-09-20 09:47:56
如题!
望高手们解答.........
...全文
199 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
star19678051 2011-09-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jzy0801 的回复:]

在windows字符编码中有一个BOM概念,BOM是用来表示字节顺序即大端和小端,因为ANSI是一个字节,不会出现字节顺序,因此不需要BOM来标识字节顺序,这样我们可以对缓冲区中的前两个字节进行判断,如果不是FF FE或者不是FE FF的话,可以说明是ANSI字符,否则可以认为是UNICODE字符(当然了我们没有考虑UTF-8和UTF-16字符编码),只是一个简单的判断方法!
[/Quote]
貌似ANSI和UNICODE中都没有你说的情况
JZY0801 2011-09-21
  • 打赏
  • 举报
回复
在windows字符编码中有一个BOM概念,BOM是用来表示字节顺序即大端和小端,因为ANSI是一个字节,不会出现字节顺序,因此不需要BOM来标识字节顺序,这样我们可以对缓冲区中的前两个字节进行判断,如果不是FF FE或者不是FE FF的话,可以说明是ANSI字符,否则可以认为是UNICODE字符(当然了我们没有考虑UTF-8和UTF-16字符编码),只是一个简单的判断方法!
AndyZhang 2011-09-21
  • 打赏
  • 举报
回复
这个真心没法看吧
star19678051 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sptoor 的回复:]

引用楼主 star19678051 的回复:
如题!
望高手们解答.........

试一试IsTextUnicode函数呢
BOOL IsTextUnicode(
__in const VOID *lpv,
__in int iSize,
__inout LPINT lpiResult
);

参考MSDN
http://msdn.mic……
[/Quote]

这个用过了,不知道为神马,无论怎样都是返回false的.... .. . . . ..
欣客 2011-09-20
  • 打赏
  • 举报
回复
单纯从缓冲区来看,藐视还真没办法。
star19678051 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 c_losed 的回复:]

ANSII的话 应该类似 31 32 33
UNICODE 应该是31 00 32 00 33 00
[/Quote]
这个我知道,但字符串是不定的,有时里面只有一个字符,那就难判断了.... ...
如只有 32 00那么他是UNICODE还是ANSI呢?
c_losed 2011-09-20
  • 打赏
  • 举报
回复
ANSII的话 应该类似 31 32 33
UNICODE 应该是31 00 32 00 33 00
mengmingtao 2011-09-20
  • 打赏
  • 举报
回复
mark~。
Roy_Smiling 2011-09-20
  • 打赏
  • 举报
回复
我是来打酱油的哦
0153 2011-09-20
  • 打赏
  • 举报
回复
单看缓冲区,是无法区分UNICODE还是ANSI的,当然,如果知道缓冲区有效数据的长度,是可以推算的。
hyztcy 2011-09-20
  • 打赏
  • 举报
回复
unicode 一般都是大于128(unisigned)的byte开头然后连续两个字符(如果只有asc和unicode的话)
luciferisnotsatan 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhao4zhong1 的回复:]

'2'在内存中是32
L'2'在内存中是32 00
"2"在内存中也是32 00
L"2"在内存中是32 00 00 00
[/Quote]
后两个要分大小端
波特王子 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 star19678051 的回复:]
如题!
望高手们解答.........
[/Quote]
试一试IsTextUnicode函数呢
BOOL IsTextUnicode(
__in const VOID *lpv,
__in int iSize,
__inout LPINT lpiResult
);

参考MSDN
http://msdn.microsoft.com/en-us/library/dd318672%28VS.85%29.aspx
赵4老师 2011-09-20
  • 打赏
  • 举报
回复
'2'在内存中是32
L'2'在内存中是32 00
"2"在内存中是32 00
L"2"在内存中是32 00 00 00
luciferisnotsatan 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jackyjkchen 的回复:]

windows api有判断函数,但Windows 核心编程都说了不能完全准确
[/Quote]
碰到纯英文的utf-8就不是到到底是acsii还是utf-8了。
lancerEx 2011-09-20
  • 打赏
  • 举报
回复
翻书去
jackyjkchen 2011-09-20
  • 打赏
  • 举报
回复
windows api有判断函数,但Windows 核心编程都说了不能完全准确
lengxujun 2011-09-20
  • 打赏
  • 举报
回复
在缓冲末尾加00 00,然后分别用ASCII和Unicode函数输出一下,看有没有乱码:
如果ASCII和Unicode输出函数都没有乱码,那肯定是ACSII了;
如果ASCII输出函数输出乱码,Unicode输出函数输出正常,那肯定是unicode了;
如果...
如果...
然后我把lz弄的神经错乱了,我自己也神经错乱。

警告:
以上回答纯属胡言乱语,错信者后果自负。对于那些造成神经错乱,精神失常者,本人概不负责!!!
whizer 2011-09-20
  • 打赏
  • 举报
回复
单从缓冲区来看,没有办法。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧