使用EasyX制作游戏需要读写文件时遇到编码问题的解决方法
一、编码问题
例如我们需要从file.txt中读取文字,再使用outtextxy()
函数向窗口绘制文字。
查找EasyX的官方文档可知,该函数有两个重载,分别为:void outtextxy(int x, int y, LPCTSTR str)
和void outtextxy(int x, int y, TCHAR c)
。
如果我们的file.txt文件使用GBK或者GB2312编码的话,会导致VS编译器混合utf-8编码和GBK编码,导致程序不能正确绘制文字。
编码问题一直是令人头痛的问题,这里给出通用的方法论,希望能够带来一些帮助。
二、解决方法
1.重新编码txt文件
首先使用vscode打开file.txt文件,确保文件编码为utf-8。如下图:
如果不是utf-8编码,点击选择编码,通过编码重新打开,选择utf-8编码,这时原来的内容会变成乱码,将原来的内容删除,重新输入,保存即可。具体的操作如下图:
2.代码部分
首先,我们需要用到std::wstring_convert
,这个标准库需要头文件#include<codecvt>
,我们定义string str
,用static std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
定义我们所需要的从utf-8编码的字符串到宽字符串的转换器。
打开文件,读取文件内容到str内,使用from_bytes(str)
函数即可实现字符串的转换,又由于outtextxy没有使用wstring的重载,使用wstring的成员函数c_str()
即可转换成wchar_t
字符串,最终,我们用这样的代码将文字绘制在窗口上outtextxy(10, 10, converter.from_bytes(str).c_str());
。
效果如图:
完整代码如下:
#include<fstream>
#include<codecvt>
#include<string>
#include<iostream>
#include<graphics.h>
std::string str;
int main()
{
initgraph(500, 500);
static std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
std::ifstream infile("file.txt");
if (!infile)
{
std::cerr << "无法打开文件" << std::endl;
return 0;
}
std::getline(infile, str);
infile.close();
while (true)
{
outtextxy(10, 10, converter.from_bytes(str).c_str());
}
}
三、问题延伸
如果我们需要在程序内使用InputBox
对话框输入,并将输入的内容正确保存在文件里,该如何操作呢。
首先查看InputBox
的参数列表bool InputBox(LPTSTR pString, int nMaxCount, LPCTSTR pPrompt = NULL, LPCTSTR pTitle = NULL, LPCTSTR pDefault = NULL, int width = 0, int height = 0, bool bOnlyOK = true);
,其中大部分是默认参数,这里不做解释,重点是第一个参数,InputBox
只接受&wchar_t
的参数,因此,假设输入的字符串最大长度为256,我们定义TCHAR buffer[256];
数组来接收输入,写下这样的代码来弹出对话框InputBox(buffer, 256, _T("请输入:"), _T("输入框"), NULL, 0, 0, TRUE);
打开文件,定义std::string str;
,仍然使用我们刚才定义的转换器,使用to_bytes()
函数,即可将输入的内容转换为utf-8字符串。再进行输入即可。
完整代码如下:
#include<fstream>
#include<codecvt>
#include<string>
#include<iostream>
#include<graphics.h>
int main()
{
initgraph(500, 500);
static std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
TCHAR buffer[256];
InputBox(buffer, 256, _T("请输入:"), _T("输入框"), NULL, 0, 0, TRUE);
std::ofstream outfile("file.txt");
if (!outfile)
{
std::cerr << "无法打开文件" << std::endl;
return 0;
}
std::string str = converter.to_bytes(buffer);
outfile << str;
outfile.close();
}
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容