如何从以 俄文扩展ASCII码表 编码的二进制文件中将文本读取出来?

marshal_yuan 2008-07-20 08:16:43
各位大侠:
菜鸟遇到的问题是这样的:现有一个二进制存储的文件,翻译成文本文件是俄文扩展ASCII码表(0x00-0x7F即为普通的ASCII表部分,0x80-0xFF是俄文的一些字母和符号)中的一些字符。首先将这个文件按照字节读取出来成一串无符号整型的数据肯定没有问题,但是在中文的操作系统下,如何把这些无符号整型的数对应的俄文字母或者符号写到记事本中,我查阅了好久都没有查到什么?

我估计这个东西的实现可能通过一个函数就行了,但是我确实没有找到这个函数是什么,惭愧!还请各位大侠指点一下迷津啊!!
我试着使用了UNICODE,但是也只知道一些初步的、理论性的东西,就以上问题如何操作不清楚。
也试过函数MultiBytetoWideChar函数,但是结果还是没有出来,不知道没有用对函数还是这个函数的使用方法不对。

同时想继续一个问题,就是我在中文操作系统下做一个界面,能否实现这个界面中既有中文,又有俄文,如何实现?


谢谢!!!
...全文
1695 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
marshal_yuan 2008-08-31
  • 打赏
  • 举报
回复
问题已经解决!codepage应该是1251.
这里要感谢我的同学林zh老师帮忙解决这个问题,在确定这个codepage=1251时花了一个晚上的时间!同时也感谢坛子里热心的各位大侠!!
结贴给分

总结一下:简单说就是首先定义UNICODE和_UNICODE(方法前面有提到),然后读取的窄字符使用函数MultiByteToWideChar(1251,……)进行转换就行了

marshal_yuan 2008-07-24
  • 打赏
  • 举报
回复
谢谢楼上大侠回复!
由于本人学习MFC等时间尚短,虽然各位有提示,但是事情还是没有解决。所以恳请各位大侠能够更加细致的讲讲或者提供一些相关的资料,不胜感谢!!

下面是我从其他地方看到的一点相关东西,一并发上来以方便有需要的人
unicode打开并访问的方式

1. 必须以binary方式打开(Windows如此,unix不知道)
2. 文件开头必须以0xFF 0xFE开始
3. 文字转换成wchar后按照字节数组方式写入
cnzdgs 2008-07-20
  • 打赏
  • 举报
回复
char str[256];
WCHAR wstr[256];
CFile fil("Russion.DAT",CFile::typeBinary|CFile::modeRead);
file.Read(str,256);
MultiByteToWideChar(866,0,str,-1,wstr,256,NULL,NULL);
这样转换得到的wstr就是Unicode字符串,你可以创建一个TXT文件把字符串写进去,文件最开头要先写入0xfeff(两字节),这样记事本才能正常显示。
界面使用Unicode字符就可以实现同时使用多种语言,但要注意系统中必须有所需的字体才能正常显示。
marshal_yuan 2008-07-20
  • 打赏
  • 举报
回复
文件的内容我是已经知道的,通过uedit32在操作系统中俄语环境下可以看出来,意思也是对的。
而且也与表http://www.microsoft.com/globaldev/reference/oem/866.mspx#top
相对应。

CFile fil("Russion.DAT",CFile::typeBinary|CFile::modeRead);
CString str="";
CString wstr=L"";
for(int i=0;i<256;i++)
{
TCHAR s;
fil.Read(&s,1);
str=str+s;
}
MultiByteToWideChar(866,0,str.GetBuffer(256),-1,wstr.GetBuffer(256),-1);
wstr.ReleaseBuffer();

问题一是我不知道这个MultiByteToWideChar函数如何使用,
如以上它就报错cannot convert parameter 3 from 'unsigned short *' to 'const char *'

问题二还是最初的问题,界面中如何实现中俄英三种文字同现。
arong1234 2008-07-20
  • 打赏
  • 举报
回复
首先你必须了解文件是怎么生成的,二进制文件的格式是不固定的,因此你如果用错误的方式读出来,就可能不对

第二,你说的俄文的代码页不一定是你实际使用的代码页,因此你必须了解生成这个文件的代码是用什么方式编码它的。文件是MBCS 还是Unicode的
如果是MCBS的,MultiBytesToWideChar应该可以,只要你上面几个做的对的话
marshal_yuan 2008-07-20
  • 打赏
  • 举报
回复
感谢前面几位大侠的帮忙,但是实质性的问题依然没有解决,还请各位继续不吝指点!!
在线等答案ing
marshal_yuan 2008-07-20
  • 打赏
  • 举报
回复
如问题中所说,UNICODE我已经自己添加了,但是如何操作不清楚。
http://www.microsoft.com/globaldev/reference/oem/866.mspx#top
这个是俄文对应的CODEPAGE。 codepage=866 俄文

int MultiByteToWideChar(
UINT CodePage, // code page
DWORD dwFlags, // character-type options
LPCSTR lpMultiByteStr, // string to map
int cbMultiByte, // number of bytes in string
LPWSTR lpWideCharStr, // wide-character buffer
int cchWideChar // size of buffer
);

上面是函数的MSDN介绍。
matrixcl 2008-07-20
  • 打赏
  • 举报
回复
第一个问题,1楼的方法应该可行

第二个问题,要同事支持两种以上非英文的语言,程序必须是支持unicode的,也就是定义了UNICODE这个宏。vs2005的工程默认会定义,VC60要自己添加
marshal_yuan 2008-07-20
  • 打赏
  • 举报
回复
现在这一块东西不清楚,代码页倒是知道是 OEM 866,但是这个函数MultiByteToWideChar函数不会使用,所以还请知道细致一点,因为小弟也是初学这个VC,再次先谢过啦!!
arong1234 2008-07-20
  • 打赏
  • 举报
回复
没有所谓的额外扩展ascii码,英语之外的语言不是通过重用128-255字符来实现的,是需要复杂的定义来实现的,每个定义就称为一种编码或者一个代码页
arong1234 2008-07-20
  • 打赏
  • 举报
回复
如果俄文字母直接在【128,255】之间,那么一定不是标准编码吧?这首先要看他的代码页是多少,再根据MultiBytesToWideChar来转换

16,547

社区成员

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

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

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