关于读取unicode文件的问题

yongziqd 2010-07-26 03:25:36
我在windows底下生成了一个unicode文件.
要在苹果底下进行读取,编译环境为xcode.
怎么用C/C++的方法进行读取?

注意,苹果的xcode底下,wchar_t是4字节的.
...全文
293 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yongziqd 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jackyjkchen 的回复:]

wstring?靠谱么,你在Windows下用的什么编译器啊,VC倒没关系,gcc for Windows据说wstring支持不好的,而如果用VC的话,win和mac两边的makefile会有很大差别的……
[/Quote]以前没想到这么多,只想用宽字符,好跨平台移植,所以现在很纠结啊.
windows的wchar_t是2字节.Mac的wchar_t是4字节.
jackyjkchen 2010-07-26
  • 打赏
  • 举报
回复
wstring?靠谱么,你在Windows下用的什么编译器啊,VC倒没关系,gcc for Windows据说wstring支持不好的,而如果用VC的话,win和mac两边的makefile会有很大差别的……
yongziqd 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jackyjkchen 的回复:]

引用 15 楼 yongziqd 的回复:
引用 13 楼 jackyjkchen 的回复:

字节序倒是个问题,不过Mac既然提供了所谓的UniChar,必然有相关的API的,就像Windows API的参数什么DWORD、LPTSTR、HANDLE一样,你既不要考虑wchar_t的问题了,就从UniChar着手试试
因为程序是pc和mac都有,所以想尽量函数接口保持一致.
看来不可……
[/Quote]我现在都用的是std::wstring
jackyjkchen 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yongziqd 的回复:]
引用 13 楼 jackyjkchen 的回复:

字节序倒是个问题,不过Mac既然提供了所谓的UniChar,必然有相关的API的,就像Windows API的参数什么DWORD、LPTSTR、HANDLE一样,你既不要考虑wchar_t的问题了,就从UniChar着手试试
因为程序是pc和mac都有,所以想尽量函数接口保持一致.
看来不可能了.
[/Quote]

#ifdef Win32
typedef MyWChar wchar_t
#elif Mac
typedef MyWChar UniChar
#endif


至于字符串函数,自己封装一个,内部也用预处理调用win和mac版
yongziqd 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jackyjkchen 的回复:]

字节序倒是个问题,不过Mac既然提供了所谓的UniChar,必然有相关的API的,就像Windows API的参数什么DWORD、LPTSTR、HANDLE一样,你既不要考虑wchar_t的问题了,就从UniChar着手试试
[/Quote]因为程序是pc和mac都有,所以想尽量函数接口保持一致.
看来不可能了.
yongziqd 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jackyjkchen 的回复:]

字节序倒是个问题,不过Mac既然提供了所谓的UniChar,必然有相关的API的,就像Windows API的参数什么DWORD、LPTSTR、HANDLE一样,你既不要考虑wchar_t的问题了,就从UniChar着手试试
[/Quote]嘿嘿,多谢.
看来我真是钻牛角尖了,老想从字节上面解决.
jackyjkchen 2010-07-26
  • 打赏
  • 举报
回复
字节序倒是个问题,不过Mac既然提供了所谓的UniChar,必然有相关的API的,就像Windows API的参数什么DWORD、LPTSTR、HANDLE一样,你既不要考虑wchar_t的问题了,就从UniChar着手试试
yongziqd 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jackyjkchen 的回复:]

UniChar是Mac定义的双字节字符么,那就太好办了……

直接用UniChar*接数据
[/Quote]这是个好办法,我咋没想到呢,明天去试试.
yongziqd 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jackyjkchen 的回复:]

引用 8 楼 yongziqd 的回复:
引用 7 楼 jackyjkchen 的回复:

引用 4 楼 taotaotheripper 的回复:
读取的话,直接2进制读进来,放到char数组里就可以了啊。
如果要进行文本操作,就两个两个char看,我原来作UTF-8文件时就这么做的,呵呵,有点笨拙

UTF8本来就应该这样啊,UTF16的也好办,fread/fwrite的buff……
[/Quote]Mac很烦人的.
从UTF16文件读取数据,按正常来说,就是两个字节组成一个宽字符.
可是在Mac下,要4个字节组成一个宽字符.所以读了2个字节之后,还要把另两个字节补0.
由于程序需要,还要把宽字符转换成ASCII字符,也没有现成的API.
还要考虑是不是Intel的机器,如果是Intel的话,字节的顺序还不一样.
jackyjkchen 2010-07-26
  • 打赏
  • 举报
回复
UniChar是Mac定义的双字节字符么,那就太好办了……

直接用UniChar*接数据
jackyjkchen 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yongziqd 的回复:]
引用 7 楼 jackyjkchen 的回复:

引用 4 楼 taotaotheripper 的回复:
读取的话,直接2进制读进来,放到char数组里就可以了啊。
如果要进行文本操作,就两个两个char看,我原来作UTF-8文件时就这么做的,呵呵,有点笨拙

UTF8本来就应该这样啊,UTF16的也好办,fread/fwrite的buffer都是void*,可接受任意类型的,可以用s……
[/Quote]
你想怎么还原?short*的内容本来该是什么就是什么……你是说想用字符串类的算法?我不清楚Mac是否有相关的API
yongziqd 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jackyjkchen 的回复:]

引用 4 楼 taotaotheripper 的回复:
读取的话,直接2进制读进来,放到char数组里就可以了啊。
如果要进行文本操作,就两个两个char看,我原来作UTF-8文件时就这么做的,呵呵,有点笨拙

UTF8本来就应该这样啊,UTF16的也好办,fread/fwrite的buffer都是void*,可接受任意类型的,可以用short *啊,QT这一类跨平台库,处理UTF16都……
[/Quote]读取文件都好读,就是读取之后,把数据还原比较麻烦.
jackyjkchen 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 taotaotheripper 的回复:]
读取的话,直接2进制读进来,放到char数组里就可以了啊。
如果要进行文本操作,就两个两个char看,我原来作UTF-8文件时就这么做的,呵呵,有点笨拙
[/Quote]
UTF8本来就应该这样啊,UTF16的也好办,fread/fwrite的buffer都是void*,可接受任意类型的,可以用short *啊,QT这一类跨平台库,处理UTF16都用的short
yongziqd 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 taotaotheripper 的回复:]

读取的话,直接2进制读进来,放到char数组里就可以了啊。
如果要进行文本操作,就两个两个char看,我原来作UTF-8文件时就这么做的,呵呵,有点笨拙
[/Quote]呵呵,不管什么方法,只要能解决就行.
我查了2天资料了,苹果上好像没有好的方法.
我现在的思路是: 从文件上逐个字节获取,然后两个字节合并成一个UniChar,
然后调用CFStingCreateWithCharacters,生成一个CFStringRef,
然后调用CFStringGetCString生成C字符串.
不过还没有调试通...
killernan 2010-07-26
  • 打赏
  • 举报
回复
看下MultiByteToWideChar 或者WideCharToMultiByte 可能会对你有所帮助
taotaotheripper 2010-07-26
  • 打赏
  • 举报
回复
读取的话,直接2进制读进来,放到char数组里就可以了啊。
如果要进行文本操作,就两个两个char看,我原来作UTF-8文件时就这么做的,呵呵,有点笨拙
fcly1981826ly 2010-07-26
  • 打赏
  • 举报
回复
学习学习学习
yongziqd 2010-07-26
  • 打赏
  • 举报
回复
自己顶
ayw215 2010-07-26
  • 打赏
  • 举报
回复
没用过
帮顶

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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