如何把繁体中文的文本文件转换为unicode编码?

erben 2007-10-19 02:22:20
程序在简体中文系统下unicode方式编译运行。。。。
使用setlocale。。。MultiByteToWideChar
转换均不成功,因为如果成功,使用SetWindowTextW(s3)文字将能正常显示在静态文本控件中。。。
...全文
550 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaozijian110 2007-10-19
  • 打赏
  • 举报
回复

试过了,使用MultiByteToWideChar()是可以的,关键在于第一个参数,代码页的设置:
CP_ACP 代表系统默认代码页,在简体中文系统下,它等于 936,
要把繁体中文转化成Unicode,这里必须指定繁体中文的代码页,就我所知Big 5的代码页是 950,
所以下面程序中使用的代码页标志是 950

#include <windows.h>
#include <tchar.h>

#pragma comment(linker,"/subsystem:console")

int _tmain(int argc,TCHAR* argv[])
{
HANDLE hFileIn,hFileOut;
DWORD dwSize,dwRet;
BYTE data_in[100];
WCHAR data_out[100];

hFileIn = CreateFile(_T("c:\\繁体中文.txt"),GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);

hFileOut = CreateFile(_T("c:\\Unicode.txt"),GENERIC_WRITE,
FILE_SHARE_READ,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,NULL);

dwSize = GetFileSize(hFileIn,NULL);
ZeroMemory(data_in,sizeof(data_in));
ReadFile(hFileIn,data_in,dwSize,&dwRet,NULL);


ZeroMemory(data_out,sizeof(data_out));
MultiByteToWideChar(950,0,data_in,-1,
data_out,sizeof(data_out) / sizeof(data_out[0]));

WriteFile(hFileOut,data_out,
wcslen(data_out) * sizeof(WCHAR),&dwRet,NULL);

CloseHandle(hFileIn);
CloseHandle(hFileOut);

return 0;
}
erben 2007-10-19
  • 打赏
  • 举报
回复
950和10002都成功了。。。。
loops 2007-10-19
  • 打赏
  • 举报
回复
刚才我没有疏忽了,10002是MAC机上的big5编码,950是ANSI的标准。
loops 2007-10-19
  • 打赏
  • 举报
回复
在vc2005带的msdn里输入如下的地址:ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/intl/unicode_81rn.htm

单击WideCharToMultiByte函数说明里的codepage有链接指向上面,而MultiByteToWideChar则找不到该链接。

在微软的msdn里我经常找不到所要的东西。
Yofoo 2007-10-19
  • 打赏
  • 举报
回复
楼主说的应该不是繁体的问题, 如果是繁体SetWindowTextW应该就没问题
应该是big5编码

VOID BIG52GBK(CHAR *pStr, _bstr_t * pbStrText)
{
if(pStr == NULL || pStr[0] == 0)
return;

int nNeedLen = strlen(pStr)+1;
WCHAR * pText = new WCHAR[nNeedLen];

int nReturn = MultiByteToWideChar(950, 0, pStr, nNeedLen, pText, nNeedLen);
*pbStrText = pText;

delete[] pText;
}


erben 2007-10-19
  • 打赏
  • 举报
回复
哦,原来关键在MultiByteToWideChar(10002,0,p,strlen(p),m,20);
里面的10002啊,去哪里查pagecode代码??
loops 2007-10-19
  • 打赏
  • 举报
回复
我搞不懂大名鼎鼎的csdn为啥不支持firefox。

#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
char p[] = { 0xc3,0xf6,0xb3,0xac,0}; //"关闭"的big-5码
wchar_t m[20];
memset(m,0,sizeof(wchar_t)*20);
MultiByteToWideChar(10002,0,p,strlen(p),m,20);
wcout.imbue(locale("chs"));
wcout <<m <<endl;
return 0;
}

loops 2007-10-19
  • 打赏
  • 举报
回复
首先繁体中文的编码是big-5还是gbk?(可打开word看出)
其次,如果是big5的话,MultiByteToWideChar中代码页指定对了吗?
第三,试试下面的程序。
[code = C\C++]

#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
char p[] = { 0xc3,0xf6,0xb3,0xac,0};
wchar_t m[20];
memset(m,0,sizeof(wchar_t)*20);
MultiByteToWideChar(10002,0,p,strlen(p),m,20);
wcout.imbue(locale("chs"));
wcout <<m <<endl;
return 0;
}
[/code]

erben 2007-10-19
  • 打赏
  • 举报
回复
在繁体中文系统下能够成功

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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