• 主页
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发

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

guyong009 2007-05-08 10:19:09
在c++ builder 里,怎么把Unicode编码的txt文件内容转换成GBK编码?
...全文
6071 点赞 收藏 45
写回复
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分,这个问题很着急呀,谢谢了~~
回复 点赞
发动态
发帖子
C++ Builder
创建于2007-08-02

2570

社区成员

10.2w+

社区内容

C++ Builder相关内容讨论区
社区公告
暂无公告