找回密码
 FreeOZ用户注册
查看: 2909|回复: 9
打印 上一主题 下一主题

[论坛技术] 问一个WidecharToMultiBytes的问题

[复制链接]
跳转到指定楼层
1#
发表于 12-2-2010 18:32:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
有一个程序,其中一个功能是把一些string转换成utf8,然后保存起来,以后读出来的时候,再从utf8转换回来。这个是用QT里面的Qstring实现的。
我现在想在一个简单的测试程序上实现这个功能,但是用MultiBytesToWideChar和WideCharToMultiBytes的时候都要指定code page的,光使用如果只是用CP_ACP和CP_UTF8貌似不行。问题在于我用这个测试程序去读真正的那个程序保存的内容,其中有一个中文字符,已经被转换成utf8了,我用MultiBytesToWideChar转换成UNICODE的时候,可以调试看到UNICODE string是没问题的,但是用WideCharToMultiBytes,参数CP_ACP,这时候这个中文字符就变成问号(?)了。
我知道这是因为这个不能正常的在ANSI的code page下转换,所以用默认字符问号(?)代替了。除非我指定code page为GB,不然就总是问号。我想在输入的时候也有相应的问题,我可能没法在ANSI的code page下输入中文。

我是想问,难道QT的Qstring自动识别了输入内容的code page?还是把安装了的code page每个都试了一遍?有什么办法在不写死code page为GB的情况下能让WideCharToMultiBytes正确转换这个string?
回复  

使用道具 举报

2#
发表于 13-2-2010 13:14:01 | 只看该作者

回复 #1 fred_au 的帖子

你的程序是在Windows平台运行的吗?

我不知道QT的具体原理,估计是有一个自动检测源encoding的函数,不过这种函数可能不会100%准确(因为很多字符的编码是冲突的),还是有风险的,如果可能,还是指定源encoding比较好。

如果是Linux的,可以试试iconv的函数库或php的相关函数,参考这个帖子:
http://hi.baidu.com/demonsnearby ... 40a008918f9db2.html

评分

参与人数 1威望 +20 收起 理由
fred_au + 20 谢谢分享!

查看全部评分

回复  

使用道具 举报

3#
 楼主| 发表于 15-2-2010 09:11:08 | 只看该作者
是在windows上的,MultiBytesToWideChar和WideCharToMultiBytes都是windows的函数。
回复  

使用道具 举报

4#
 楼主| 发表于 15-2-2010 14:33:25 | 只看该作者
我想到了另一个可能性,QTString可能是UNICODE的,UNICODE和UTF8之间的转换是没有问题的。
回复  

使用道具 举报

5#
发表于 15-2-2010 14:49:02 | 只看该作者
我不知道原理阿,不过也许下面QT的文档有帮助。

Detailed Description

The QString class provides a Unicode character string.

QString stores a string of 16-bit QChars, where each QChar corresponds one Unicode 4.0 character. (Unicode characters with code values above 65535 are stored using surrogate pairs, i.e., two consecutive QChars.)

评分

参与人数 1威望 +20 收起 理由
fred_au + 20 谢谢分享!

查看全部评分

回复  

使用道具 举报

6#
发表于 15-2-2010 14:53:26 | 只看该作者
学习乐

评分

参与人数 1威望 +15 收起 理由
fred_au + 15 见者有份!

查看全部评分

回复  

使用道具 举报

7#
 楼主| 发表于 15-2-2010 15:32:06 | 只看该作者
嗯。。。我想QTString在程序UNICODE enabled的情况下自动支持UNICODE,所以我在原本那个程序上看到的只是UNICODE和UTF8之间的转换。
所以要转换到ANSI还是GB,还是要指定code page才行。
回复  

使用道具 举报

8#
发表于 15-2-2010 16:06:20 | 只看该作者

回复 #7 fred_au 的帖子

嗯,UTF8只是UNICODE的一种表现形式,二者本质上是同一个东西,当然没有问题。
回复  

使用道具 举报

9#
 楼主| 发表于 15-2-2010 23:30:01 | 只看该作者
回复  

使用道具 举报

10#
 楼主| 发表于 16-2-2010 00:25:57 | 只看该作者
苍天阿。。。。你在玩我么。。。
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 30-4-2024 12:39 , Processed in 0.048698 second(s), 30 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表