dbf读取可能是关于字符集的一个问题,求解
多谢关注:
另一版的讨论:http://community.csdn.net/Expert/topic/4239/4239392.xml?temp=.8460962
/////////////////////////////////////////////////////////////
--------------------------------------------------------------------
测试文件下载:
请大家告诉大家,到这下载,在目录csdn里面的两个文件,test_rus.dbf、test_utf8.dbf
其栏位fullname为我所说的字段,分别为ISO Cyrillic 8859-5编码和utf-8编码
俄文test_rus.dbf和中文test_utf8.dbf
http://vip.sina.com.cn/cgi-bin/mydocument/share_list13.cgi?uid=homerlpx
-----------------------------------------------------------------------
问题:
我的原数据库是dbf文件的(德国客户公司提供的数据),我试用了两种方法进行处理:一、直接通过ado,dbf引擎读取dbf文件,结果数据出现了很多?,读出来的数据同dbf文件中的原数据比较,这些?都是把本不是0x3f的值转成了0x3f。二、通过sql语句将dbf转入mdb文件,发觉mdb文件中的数据已经不对了,那些数据也变成了0x3f。后来我试着用excel软件打开dbf文件,数据也是错误的(0x3f),而用foxpro软件打开dbf文件,里面的数据在界面上开上去是“?”(不能识别,所以显示为?)但察看实际数据却跟原数据相同,这说明foxpro读取成功了。但如何通过ado读取成功呢?
-----------------------------------------------------------------------
我的读取代码:
CString strQuaryValue, strGB;
varTheVarlue = m_pRecordset->Fields->GetItem(_variant_t("fullname"))->Value;
if (varTheVarlue.vt != VT_NULL && varTheVarlue.vt != VT_EMPTY)
{
strQuaryValue = (char*)(_bstr_t)varTheVarlue;
UTF82GB(strQuaryValue, strGB);//自己写的转换函数
}
...
-----------------------------------------------------------------------------
字符转换:
读取出来的数据经下面的函数转换就可以使用了,中文的在中文系统下,俄文的要在俄文系统下看。没有俄文系统的俄文转后可能还是乱码,可以使一下中文的处理,过程是一样的
中文的转换
int UTF82GB(CString &strUni, CString & strGB)
{
char * pszGB = NULL;
char* pszUTF8 = strUni.GetBuffer(0);
wchar_t * pwszUnicode = NULL;
int nLen = MultiByteToWideChar (CP_UTF8, 0, pszUTF8, -1 ,NULL, 0);
pwszUnicode = new wchar_t[nLen];
memset(pwszUnicode, 0, nLen);
MultiByteToWideChar(CP_UTF8, 0, pszUTF8, -1, pwszUnicode, nLen);
nLen = WideCharToMultiByte(936, 0, pwszUnicode, nLen, NULL, 0, NULL, NULL);
pszGB = new char[nLen];
memset(pszGB, 0, nLen);
WideCharToMultiByte(936, 0, pwszUnicode, -1 , pszGB, nLen, NULL, NULL);
strGB = CString(pszGB);
strUni.UnlockBuffer();
delete [] pwszUnicode;
delete [] pszGB;
return strGB.GetLength();
}
ISO Cyrillic 8859-5编码到俄文的转换
int Cyrillic2RU(CString &strCyrillic, CString & strRU)
{
char * pszRU = NULL;
char* pszUTF8 = strCyrillic.GetBuffer(0);
wchar_t * pwszUnicode = NULL;
int nLen = MultiByteToWideChar(28595, 0, pszUTF8, -1 ,NULL, 0);
pwszUnicode = new wchar_t[nLen];
memset(pwszUnicode, 0, nLen);
MultiByteToWideChar(28595, 0, pszUTF8, -1, pwszUnicode, nLen);
nLen = WideCharToMultiByte(1251, 0, pwszUnicode, nLen, NULL, 0, NULL, NULL);
pszRU = new char[nLen];
memset(pszRU, 0, nLen);
WideCharToMultiByte(1251, 0, pwszUnicode, -1 , pszRU, nLen, NULL, NULL);
strRU = CString(pszRU);
delete [] pwszUnicode;
delete [] pszRU;
return strRU.GetLength();
}