如何判断一个CString的编码?

如何判断一个CString的编码?
0 votes, 0.00 avg. rating (0% score)
在使用CHttpFile下载网页文件,但是不同的网站源码用的编码方式不一样。有关网上的代码大家就不要贴了,我基本上都看了。

目前需要的解决的问题是:
如何判断一个CString的编码?

分不是问题哦亲

13 个回答
回答:

引用 12 楼 haltwang 的回复:

引用 11 楼 devmiao 的回复:引用 10 楼 haltwang 的回复:引用 9 楼 devmiao 的回复:引用 6 楼 haltwang 的回复:引用 4 楼 devmiao 的回复:引用 3 楼 haltwang 的回复:引用 2 楼 devmiao 的回复:没有文件头,只能靠猜

http://blogs.msdn.com/b/michkap/arc……

如果都是<开头,除非以ANSI编码的开头出现3C 00(就是<加以个空白字符00),但是空白字符不可能出现啊,空格是14。所以基本上搞定,嘿嘿。

还有个问题是ANSI编码并不全是127一下,GB2312 GBK这样的保存成txt后就是ANSI编码。只是单字节代表常用字符,双字节代表汉子。所以区分ANSI 跟 UTF8还比较困难。
我用的方法是:
utf8的汉子都是三个字节表示一个而且这三个字节的特点是 1110XXXX  10XXXXXX 10XXXXXX 我读到第一个大于127的时候判断开头是不是1110就可以了。除非运气超差,第一个就遇到以1110开头的GBK编码,否则还是可以的。

运气差也没办法了 就想我们的“联通”

回答:

引用 11 楼 devmiao 的回复:

引用 10 楼 haltwang 的回复:引用 9 楼 devmiao 的回复:引用 6 楼 haltwang 的回复:引用 4 楼 devmiao 的回复:引用 3 楼 haltwang 的回复:引用 2 楼 devmiao 的回复:没有文件头,只能靠猜

http://blogs.msdn.com/b/michkap/archive/2005/01/30/3633……

不是吧,目前我遇到的都是的。最起码第一个字符一定是<吧,html不是标记语言么,每个标签都要以<开头。

回答:

引用 10 楼 haltwang 的回复:

引用 9 楼 devmiao 的回复:引用 6 楼 haltwang 的回复:引用 4 楼 devmiao 的回复:引用 3 楼 haltwang 的回复:引用 2 楼 devmiao 的回复:没有文件头,只能靠猜

http://blogs.msdn.com/b/michkap/archive/2005/01/30/363308.aspx

IsTextUnic……

并不是所有的html都是以<!开头的哦。除非你只访问特定的服务器。

回答:

引用 9 楼 devmiao 的回复:

引用 6 楼 haltwang 的回复:引用 4 楼 devmiao 的回复:引用 3 楼 haltwang 的回复:引用 2 楼 devmiao 的回复:没有文件头,只能靠猜

http://blogs.msdn.com/b/michkap/archive/2005/01/30/363308.aspx

IsTextUnicode函数能够帮助进行这种区分:
 ……

我把四种编码方式具体看了下,想了这个办法:
所有的html文件开头都是”<!”而这个俩字符不同编码的值如下:
ANSI  3c 21
unicode 3C 00 21 00
unicode big endian 00 3C 00 21
UTF8  3C 21
这样就只有ANSI 跟 UTF8没有区分出来了
但是ANSI所有内容都是小于127的,只要再做一个判断就把两种区分出来了

回答:

引用 6 楼 haltwang 的回复:

引用 4 楼 devmiao 的回复:引用 3 楼 haltwang 的回复:引用 2 楼 devmiao 的回复:没有文件头,只能靠猜

http://blogs.msdn.com/b/michkap/archive/2005/01/30/363308.aspx

IsTextUnicode函数能够帮助进行这种区分:
    DWORD IsTextUnico……

按理说,服务器应该在http报文响应头的content type的charset指定编码。如果服务器不告诉你,就只好猜了。

回答:

引用 5 楼 haltwang 的回复:

引用 4 楼 devmiao 的回复:引用 3 楼 haltwang 的回复:引用 2 楼 devmiao 的回复:没有文件头,只能靠猜

http://blogs.msdn.com/b/michkap/archive/2005/01/30/363308.aspx

IsTextUnicode函数能够帮助进行这种区分:
    DWORD IsTextUnico……

所谓猜,就好比你考试遇到不会做的选择题,你就蒙一个,既然是蒙,就蒙那个可能性大的。

回答: 我找到了相关文章,正在看。
谢谢大神你。
我后期尽量解决这个问题跟大家分享
回答:

引用 4 楼 devmiao 的回复:

引用 3 楼 haltwang 的回复:引用 2 楼 devmiao 的回复:没有文件头,只能靠猜

http://blogs.msdn.com/b/michkap/archive/2005/01/30/363308.aspx

IsTextUnicode函数能够帮助进行这种区分:
    DWORD IsTextUnicode(CONST PVOID pvBu……

还是先不想好玩的。
我只是想解决从网站上下载网页源代码,然后查找关键字。因为不同网站编码不一样,所以一旦编码有问题就会出现乱码,导致查找失败。

能不能从其他环节上解决,比如CHttpFile在下载的时候就判断编码方式,或者读到CString以后判断CString编码方式,而不是判断txt文本编码方式。

回答:

引用 4 楼 devmiao 的回复:

引用 3 楼 haltwang 的回复:引用 2 楼 devmiao 的回复:没有文件头,只能靠猜

http://blogs.msdn.com/b/michkap/archive/2005/01/30/363308.aspx

IsTextUnicode函数能够帮助进行这种区分:
    DWORD IsTextUnicode(CONST PVOID pvBu……

还有这么好玩的东西,学习了。
能不能教我怎么猜编码

回答:

引用 3 楼 haltwang 的回复:

引用 2 楼 devmiao 的回复:没有文件头,只能靠猜

http://blogs.msdn.com/b/michkap/archive/2005/01/30/363308.aspx

IsTextUnicode函数能够帮助进行这种区分:
    DWORD IsTextUnicode(CONST PVOID pvBuffer,int cb,PINT pResult);
    i……

记事本也是猜的。

所以就有了在记事本里输入“联通”,保存,关闭再打开,出现乱码的问题,一个笑话说因为微软和联通有仇。

http://it.enorth.com.cn/system/2003/12/11/000686404.shtml

IsTextUnicode当然不是只能区分unicode,它的返回值有很多,具体msdn下吧。

回答:

引用 2 楼 devmiao 的回复:

没有文件头,只能靠猜

http://blogs.msdn.com/b/michkap/archive/2005/01/30/363308.aspx

IsTextUnicode函数能够帮助进行这种区分:
    DWORD IsTextUnicode(CONST PVOID pvBuffer,int cb,PINT pResult);
    isTextU……

其实我是可以通过打开txt文件,用另存为来判断的(下面默认的是什么编码就是什么编码),只是在程序中没办法判断。我奇怪的是windows那个打开txt文件的应用程序是用什么方法来判断编码的呢?

关于IsTextUnicode我想请教下:只能用它区分是不是unicode么?那utf8  ansi  unicode big endian这些怎么办?

初学MFC的小菜,之前用的是Qt,对编码问题不很清楚,希望大神指点

回答: 没有文件头,只能靠猜

http://blogs.msdn.com/b/michkap/archive/2005/01/30/363308.aspx

IsTextUnicode函数能够帮助进行这种区分:
    DWORD IsTextUnicode(CONST PVOID pvBuffer,int cb,PINT pResult);
    isTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容.由于这不是一个确切的科学方法,因此IsTextUnicode有可能返回不正确的结果.
    第一个参数pvBuffer用语表使要测试的缓存地址.该数据是个无效指针,因为你不知道你拥有的是ansi字符数组还是unicode的字符数组.
    第二个参数cb设定pvBuffer指向的字节数,同样,由于你不知道缓存中放的是什么,隐蔽cb是个字节数,而不是字符数.
  第三个pResult是个证书的地址,必须在调用IsTextUnicode之前对他进行初始化,对该证书进行初始化后,就可以指明你要IsTextUnicode执行那些测试.也可以为该参数传递NULL,在这种情况下,IsTextUnicode将执行他能够进行的所有测试.
    如果IsTextUnicode认为缓存中包含Unicode文本,将返回TRUE,否则将返回FALSE.

回答: 或者有人能有办法判断txt文件的编码么?帮帮我哦。

网上大家说的通过文件头的几个字节判断的方法不行:
EF BB BF UTF-8

FE FF UTF-16/UCS-2, little endian

FF FE UTF-16/UCS-2, big endian

FF FE 00 00 UTF-32/UCS-4, little endian.

00 00 FE FF UTF-32/UCS-4, big-endian.

因为我用CHttpFile类保存下来的txt文件虽然用微软的阅读器打开有各种编码,但是用二进制文件打开发现根本没有上面所说的标志编码的头字节。
经试验上面的方法失败。

或者有没有什么办法调用什么东西能直接对txt文本转码也行啊。就是手动换一种编码后另存为的那种效果,用代码实现

本条目发布于 。属于 VC.NET 分类。作者是 admin 7 次浏览