C语言如何把ANSI转UTF-8

shiweifu 2009-10-14 08:46:46
还在做上次那个记账的东东。。
做到数据保存了,打算先做SQLITE和XML两套方案
因为考虑到跨平台移植方便,所以基础的功能都是用纯C实现的
保存为XML用了MINIXML库
http://www.minixml.org/strfiles/93/minixml-cn.html

感觉还不错,就是保存数据的时候,默认是保存为ANSI格式的
想把它保存为UTF-8,不知道如何做

文本貌似MINIXML已经是转换为UTF-8保存的,我打开可以正常看到文本信息,就是打开浏览器,看到的是乱码。。

有没有跨平台的统一解决办法。。
...全文
3827 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqwx_1986 2009-10-17
  • 打赏
  • 举报
回复
iconv
一直在用这个 你网上搜搜
icansaymyabc 2009-10-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 shiweifu 的回复:]
...

文本貌似MINIXML已经是转换为UTF-8保存的,我打开可以正常看到文本信息,就是打开浏览器,看到的是乱码。。

...

[/Quote]

关键是这个哦,人家都给你转换好了的无须你自己转换了。就是打开浏览器,看到的是乱码那是因为你没有告诉浏览器你用了 utf-8,浏览器把 utf8 当 ansi 解释当然出乱码了。

解决方法就是在你保存的XML中显式说明你的编码方式是utf8
tzqqkl 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 loaden 的回复:]
先转到Unicode,再到UTF-8。
下面代码虽然是C++的,但改成C是很容易的。
只适合Windows平台。

C/C++ codeqp::StringW Global::AnsiToUnicode(constchar* buf)
{int len= ::MultiByteToWideChar(CP_ACP,0, buf,-1, NULL,0);if (len==0)return L"";

std::vector<wchar_t> unicode(len);
::MultiByteToWideChar(CP_ACP,0, buf,-1,&unicode[0], len);return&unicode[0];
}

qp::StringA Global::UnicodeToAnsi(const wchar_t* buf)
{int len= ::WideCharToMultiByte(CP_ACP,0, buf,-1, NULL,0, NULL, NULL);if (len==0)return"";

std::vector<char> utf8(len);
::WideCharToMultiByte(CP_ACP,0, buf,-1,&utf8[0], len, NULL, NULL);return&utf8[0];
}

qp::StringW Global::Utf8ToUnicode(constchar* buf)
{int len= ::MultiByteToWideChar(CP_UTF8,0, buf,-1, NULL,0);if (len==0)return L"";

std::vector<wchar_t> unicode(len);
::MultiByteToWideChar(CP_UTF8,0, buf,-1,&unicode[0], len);return&unicode[0];
}

qp::StringA Global::UnicodeToUtf8(const wchar_t* buf)
{int len= ::WideCharToMultiByte(CP_UTF8,0, buf,-1, NULL,0, NULL, NULL);if (len==0)return"";

std::vector<char> utf8(len);
::WideCharToMultiByte(CP_UTF8,0, buf,-1,&utf8[0], len, NULL, NULL);return&utf8[0];
}
[/Quote]
这段代码只能在windows下用吧
whg01 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 garfield 的回复:]
iconv就能跨平台了。不过win下面得用mingw的dll。
另外,浏览器乱码这个问题,如果不是在XMLRequest情况下使用(AJAX非得需要UTF-8)
你可以用gbk编码也能正常显示的,不过你要加个
<?xml version="1.0" encoding="GBK"?>
这样的头部,浏览器就认识了。
至于怎么看文件编码,我想,你会的。
[/Quote]
<?xml version="1.0" encoding="utf-8"?> xml文件的头部写成这样,就可以了。
Garfield 2009-10-14
  • 打赏
  • 举报
回复
iconv就能跨平台了。不过win下面得用mingw的dll。
另外,浏览器乱码这个问题,如果不是在XMLRequest情况下使用(AJAX非得需要UTF-8)
你可以用gbk编码也能正常显示的,不过你要加个
<?xml version="1.0" encoding="GBK"?>
这样的头部,浏览器就认识了。
至于怎么看文件编码,我想,你会的。
kakashi0309 2009-10-14
  • 打赏
  • 举报
回复
自己写个转换函数吧 \(^o^)/~ Unicode-->UTF-8

老邓 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shiweifu 的回复:]
因为主要就是要保存xml,用的是minixml库,从文档上看,支持保存为UTF-8。。但没找到相关参数。。如果有用过的大大。。希望能提示下
[/Quote]
你查MultiByteToWideChar、WideCharToMultiByte这两个API的用法。
shiweifu 2009-10-14
  • 打赏
  • 举报
回复
因为主要就是要保存xml,用的是minixml库,从文档上看,支持保存为UTF-8。。但没找到相关参数。。如果有用过的大大。。希望能提示下
老邓 2009-10-14
  • 打赏
  • 举报
回复
先转到Unicode,再到UTF-8。
下面代码虽然是C++的,但改成C是很容易的。
只适合Windows平台。

qp::StringW Global::AnsiToUnicode(const char* buf)
{
int len = ::MultiByteToWideChar(CP_ACP, 0, buf, -1, NULL, 0);
if (len == 0) return L"";

std::vector<wchar_t> unicode(len);
::MultiByteToWideChar(CP_ACP, 0, buf, -1, &unicode[0], len);

return &unicode[0];
}

qp::StringA Global::UnicodeToAnsi(const wchar_t* buf)
{
int len = ::WideCharToMultiByte(CP_ACP, 0, buf, -1, NULL, 0, NULL, NULL);
if (len == 0) return "";

std::vector<char> utf8(len);
::WideCharToMultiByte(CP_ACP, 0, buf, -1, &utf8[0], len, NULL, NULL);

return &utf8[0];
}

qp::StringW Global::Utf8ToUnicode(const char* buf)
{
int len = ::MultiByteToWideChar(CP_UTF8, 0, buf, -1, NULL, 0);
if (len == 0) return L"";

std::vector<wchar_t> unicode(len);
::MultiByteToWideChar(CP_UTF8, 0, buf, -1, &unicode[0], len);

return &unicode[0];
}

qp::StringA Global::UnicodeToUtf8(const wchar_t* buf)
{
int len = ::WideCharToMultiByte(CP_UTF8, 0, buf, -1, NULL, 0, NULL, NULL);
if (len == 0) return "";

std::vector<char> utf8(len);
::WideCharToMultiByte(CP_UTF8, 0, buf, -1, &utf8[0], len, NULL, NULL);

return &utf8[0];
}
whg01 2009-10-14
  • 打赏
  • 举报
回复
把xml设置成utf8编码,这样你给它传个asc的字符串,它也能存成utf8编码。
jackyjkchen 2009-10-14
  • 打赏
  • 举报
回复
XML都是UTF8吧,应该转过了
aizibion 2009-10-14
  • 打赏
  • 举报
回复
被楼上抢了答案 =。=
  • 打赏
  • 举报
回复
用iconv库

69,335

社区成员

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

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