Unicode编码转换成GBK编码(急,在线等)

guyong009 2007-05-08 10:19:09
在c++ builder 里,怎么把Unicode编码的txt文件内容转换成GBK编码?
...全文
6545 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lghost 2011-08-27
  • 打赏
  • 举报
回复
关注有没java的方法?
VC_ZSY 2010-04-30
  • 打赏
  • 举报
回复
学习···
jacknes009 2007-05-12
  • 打赏
  • 举报
回复
学习中
yctin 2007-05-11
  • 打赏
  • 举报
回复
在 FileRead(hFile, srcBuff, nSize); 前面加
FileSeek(hFile,0,0);
这句再看看
guyong009 2007-05-11
  • 打赏
  • 举报
回复
Utf8ToUnicode(destBuff,srcBuff,nSize * 2);里srcBuff的值是乱码,看不出来是否准确;
FileWrite(hFile,destBuff,wcslen(destBuff) * 2);里destBuff的值是:
"\X62DF\X4F20\X771tiff\..."(...部分的内容我这里省略不写了),而我原文件里的值是“虚拟传真tiff...”),转换后变为"拟传真tiff...",第一个字“虚”没了
yctin 2007-05-11
  • 打赏
  • 举报
回复
我试过是不会掉字的
yctin 2007-05-11
  • 打赏
  • 举报
回复
你在这里设断点看看destBuff是否正确
FileWrite(hFile,destBuff,wcslen(destBuff) * 2);

看看这里srcBuff的HEX是否正确(原文件的第四btye开始)
Utf8ToUnicode(destBuff,srcBuff,nSize * 2);
guyong009 2007-05-11
  • 打赏
  • 举报
回复
TO:yctin(呆呆鱼)
昨天上不了网,郁闷。今天刚测试了下你写的UTF8FileConvertToUnicode,能正常转换了,不会乱码了,但转换后第一个字会没掉,这个这么办?
guyong009 2007-05-11
  • 打赏
  • 举报
回复
刚调试了下,
nSize = FileSeek(hFile,0,2);
if (nSize < 4) {
return;
}
执行这段代码时nSize 的值为2,所以就退出来了。

我是这样调用的:(path是文件路径)
UTF8FileConvertToUnicode(path.c_str(),path.c_str());
UnicodeFileConvertToAnsi(path.c_str(),path.c_str());
guyong009 2007-05-11
  • 打赏
  • 举报
回复
你上面写的UnicodeFileConvertToAnsi是转成GBK吗?
调用完UTF8FileConvertToUnicode再调用UnicodeFileConvertToAnsi会报错:
access violation at 0x00472cc9 write of address 0x00030d90
guyong009 2007-05-11
  • 打赏
  • 举报
回复
这样改就可以了。现在utf-8转换成Unicode可以了,但还需要把Unicode再转换成GBK,是不是调用完再UTF8FileConvertToUnicode调用UnicodeFileConvertToAnsi就可以了?
rainv 2007-05-09
  • 打赏
  • 举报
回复
mark
guyong009 2007-05-09
  • 打赏
  • 举报
回复
NowCan(城市浪人) 说的是,我是刚学BCB的,类型转换的问题我现在弄好了,现在还有哪个转换成GBK编码的问题还没好,不知道怎么弄。
NowCan 2007-05-09
  • 打赏
  • 举报
回复
怀疑楼主会不会BCB。String怎么转成char *,你不会查BCB的帮助啊?
guyong009 2007-05-09
  • 打赏
  • 举报
回复
另外,我把要转换的文件的路径是保存在String path这个变量里的,比如
String path="c:\\a.txt";这样UnicodeFileConvertToAnsi(path,"c:\\b.txt");不能调用,这个问题要怎么解决?
guyong009 2007-05-09
  • 打赏
  • 举报
回复
TO:yctin(呆呆鱼):
用你写的新的,可以转换了,但转换后还是乱码,你这个转换后是什么编码?我想要GBK编码的,麻烦你再帮我改下可以吗
ahjoe 2007-05-09
  • 打赏
  • 举报
回复
WideString ws;
AnsiString s;
ws = "Unicode编码";
s = ws;
Edit1->Text = s;

不能再简单了。
yctin 2007-05-09
  • 打赏
  • 举报
回复
换成这个吧
都跟你说那个档案不是unicode =.=
这个可以处理非unicode 的档案(复制一份=口=)

void UnicodeFileConvertToAnsi(char *src,char *dest)
{
wchar_t *srcBuff;
char *destBuff;
int hFile;
int nSize;

if (!FileExists(src)) {
return;
}

hFile = FileOpen(src,0);
FileRead(hFile, destBuff, 2);

nSize = FileSeek(hFile,0,2);
if (nSize < 4) {
FileClose(hFile);
return;
}
destBuff = (char*)malloc(2);
FileSeek(hFile,0,0);
FileRead(hFile, destBuff, 2);
if (!~destBuff[0] && !(destBuff[1] + 2)) {

free(destBuff);
destBuff = (char*)malloc(nSize);
srcBuff = (wchar_t*)malloc(nSize + 1);
memset(srcBuff,0x00,nSize + 1);

FileRead(hFile, srcBuff, nSize);
FileClose(hFile);
strcpy(destBuff,WideCharToString(srcBuff).c_str());
free(srcBuff);

hFile = FileCreate(dest);
FileWrite(hFile,destBuff,strlen(destBuff));
} else {

free(destBuff);
destBuff = (char*)malloc(nSize);

FileSeek(hFile,0,0);
FileRead(hFile, destBuff, nSize);
FileClose(hFile);

hFile = FileCreate(dest);
FileWrite(hFile,destBuff,nSize);
}
FileClose(hFile);
free(destBuff);
}
yctin 2007-05-09
  • 打赏
  • 举报
回复
....... =.=

void UTF8FileConvertToUnicode(char *srcFile,char *destFile)
{
char UnicodeHeader[2] = {0xff,0xfe};
char UTF8Header[3] = {0xef,0xbb,0xbf};
char *srcBuff;
wchar_t *destBuff;
int hFile;
int nSize;


if (!FileExists(srcFile)) {
return;
}

hFile = FileOpen(srcFile,0);
nSize = FileSeek(hFile,0,2);
if (nSize < 3) {
FileClose(hFile);
return;
}

srcBuff = (char*)malloc(3);
FileSeek(hFile,0,0);
FileRead(hFile, srcBuff, 3);
if (!memcmp(UTF8Header,srcBuff,3)) {
free(srcBuff);
destBuff = (wchar_t*)malloc(nSize * 2);
srcBuff = (char*)malloc(nSize + 1);
memset(srcBuff,0x00,nSize + 1);
memset(destBuff,0x00,nSize * 2);

FileRead(hFile, srcBuff, nSize);
FileClose(hFile);


Utf8ToUnicode(destBuff,srcBuff,nSize * 2);

hFile = FileCreate(destFile);
FileWrite(hFile,UnicodeHeader, 2);
FileWrite(hFile,destBuff,wcslen(destBuff) * 2);
}
FileClose(hFile);

free(srcBuff);
free(destBuff);
}
guyong009 2007-05-09
  • 打赏
  • 举报
回复
TO:yctin(呆呆鱼):
如果按ahjoe(强哥) 说的,
WideString ws;
AnsiString s;
ws = "Unicode编码";
s = ws;
Edit1->Text = s;
那么,ws = "Unicode编码";这行要改成:把c:\\a.txt文件里的内容复制到ws,也就是说要读取c:\\a.txt的内容到ws,然后再把s里的内容写回到c:\\a.txt。这样要怎么改?


帮我搞定了我另外开贴加100分,这个问题很着急呀,谢谢了~~
加载更多回复(25)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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