MFC GB2312、UTF-8、unicode 之间转换

MFC中如何以UNICODE编码格式读写文件 本文介绍了MFC文件读写 阅读详情
//GB2312到UTF-8的转换
static int GB2312ToUtf8(const char* gb2312, char* utf8)
{
	int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
	wchar_t* wstr = new wchar_t[len+1];
	memset(wstr, 0, len+1);
	MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
	len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
	WideCharToMultiByte(CP_UTF8, 0, wstr, -1, utf8, len, NULL, NULL);
	if(wstr) delete[] wstr;
		return len;
}

//判断是否是utf8
bool IsTextUTF8(const char* str, long length)
{
	unsigned char chr;

	int nBytes = 0; // UFT8可用1-6个字节编码,ASCII用一个字节
	bool bAllAscii = true; // 如果全部都是ASCII, 说明不是UTF-8

	for (int i=0; i < length; i++)
	{
		chr = *(str + i);

		if ((chr&0x80) != 0) // 判断是否ASCII编码,如果不是,说明有可能是UTF-8, ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx
		{
			bAllAscii = false;
		}

		if (nBytes == 0) // 如果不是ASCII码,应该是多字节符,计算字节数
		{
			if (chr >= 0x80)
			{
				if (chr>=0xFC && chr<=0xFD)
					nBytes = 6;
				else if (chr>=0xF8)
					nBytes = 5;
				else if (chr>=0xF0)
					nBytes = 4;
				else if (chr>=0xE0)
					nBytes = 3;
				else if (chr>=0xC0)
					nBytes = 2;
				else
					return false;

				nBytes--;
			}
		}
		else // every char of ascii buffer looks like 10xxxxxx, except the first char
		{
			if( (chr&0xC0) != 0x80 )
			{
				return false;
			}
			nBytes--;
		}
	}

	if (nBytes > 0) // format error
	{
		return false;
	}

	if (bAllAscii) // if all chars are ascii, the buffer is not utf-8
	{
		return false;
	}

	return true;
}


//UTF-8到GB2312的转换
static int Utf8ToGB2312(const char* utf8, char* gb2312)
{
	int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
	wchar_t* wstr = new wchar_t[len+1];
	memset(wstr, 0, len+1);
	MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
	len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
	WideCharToMultiByte(CP_ACP, 0, wstr, -1, gb2312, len, NULL, NULL);
	if(wstr) delete[] wstr;
	return len;
}


//GB2312到Unicode的转换
static int GB2312ToUnicode(const char* gb2312, char* unicode)
{
	UINT nCodePage = 936; //GB2312
	int len = MultiByteToWideChar(nCodePage, 0, gb2312, -1, NULL, 0);
	wchar_t* wstr = new wchar_t[len+1];
	memset(wstr, 0, len+1);
	MultiByteToWideChar(nCodePage, 0, gb2312, -1, wstr, len);
	len = len*sizeof(wchar_t);
	memcpy(unicode, wstr, len);
	if(wstr) delete[] wstr;
		return len;
}


//Unicode到GB2312的转换
static int UnicodeToGB2312(const char* unicode, int size, char*gb2312)
{
	UINT nCodePage = 936; //GB2312
	wchar_t* wstr = new wchar_t[size/2+1];
	memcpy(wstr, unicode, size);
	int len = WideCharToMultiByte(nCodePage, 0, wstr, -1, NULL, 0, NULL, NULL);
	WideCharToMultiByte(nCodePage, 0, wstr, -1, gb2312, len, NULL, NULL);
	if(wstr) delete[] wstr;
		return len;
}


//UTF-8到Unicode的转换
static int Utf8ToUnicode(const char* utf8, char*unicode)
{
	int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
	wchar_t* wstr = new wchar_t[len+1];
	memset(wstr, 0, len+1);
	MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
	memcpy(unicode, wstr, len);
	if(wstr) delete[] wstr;
		return len;
}


//Unicode到UTF-8的转换
static int UnicodeToUtf8(const char* unicode, int size, char* utf8)
{
	wchar_t* wstr = new wchar_t[size/2+1];
	memcpy(wstr, unicode, size);
	int len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
	WideCharToMultiByte(CP_UTF8, 0, wstr, -1, utf8, len, NULL, NULL);
	if(wstr) delete[] wstr;
	return len;
}



std::wstring UTF8ToUnicode(const std::string & str)
{
	int  len = 0;
	len = str.length();
	int  unicodeLen = ::MultiByteToWideChar(CP_UTF8,
		0,
		str.c_str(),
		-1,
		NULL,
		0);
	wchar_t* pUnicode;
	pUnicode = new  wchar_t[unicodeLen + 1];
	memset(pUnicode, 0, (unicodeLen + 1) * sizeof(wchar_t));
	::MultiByteToWideChar(CP_UTF8,
		0,
		str.c_str(),
		-1,
		(LPWSTR)pUnicode,
		unicodeLen);
	std::wstring  rt;
	rt = (wchar_t*)pUnicode;
	delete  pUnicode;

	return  rt;
}

std::wstring GBKToUnicode(const std::string& str)
{
	int  len = 0;
	len = str.length();
	int  unicodeLen = ::MultiByteToWideChar(CP_ACP,
		0,
		str.c_str(),
		-1,
		NULL,
		0);
	wchar_t* pUnicode;
	pUnicode = new  wchar_t[unicodeLen + 1];
	memset(pUnicode, 0, (unicodeLen + 1) * sizeof(wchar_t));
	::MultiByteToWideChar(CP_ACP,
		0,
		str.c_str(),
		-1,
		(LPWSTR)pUnicode,
		unicodeLen);
	std::wstring  rt;
	rt = (wchar_t*)pUnicode;
	delete  pUnicode;

	return  rt;
}

std::string UnicodeToUTF8(const std::wstring& str)
{
	char* pElementText;
	int    iTextLen;
	// wide char to multi char
	iTextLen = WideCharToMultiByte(CP_UTF8,
		0,
		str.c_str(),
		-1,
		NULL,
		0,
		NULL,
		NULL);
	pElementText = new char[iTextLen + 1];
	memset((void*)pElementText, 0, sizeof(char) * (iTextLen + 1));
	::WideCharToMultiByte(CP_UTF8,
		0,
		str.c_str(),
		-1,
		pElementText,
		iTextLen,
		NULL,
		NULL);
	std::string strText;
	strText = pElementText;
	delete[] pElementText;
	return strText;
}

std::string UnicodeToGbk(const std::wstring& str)
{
	char* pElementText;
	int    iTextLen;
	// wide char to multi char
	iTextLen = WideCharToMultiByte(CP_ACP,
		0,
		str.c_str(),
		-1,
		NULL,
		0,
		NULL,
		NULL);
	pElementText = new char[iTextLen + 1];
	memset((void*)pElementText, 0, sizeof(char) * (iTextLen + 1));
	::WideCharToMultiByte(CP_ACP,
		0,
		str.c_str(),
		-1,
		pElementText,
		iTextLen,
		NULL,
		NULL);
	std::string strText;
	strText = pElementText;
	delete[] pElementText;
	return strText;
}

std::string GBKToUTF8(const std::string &strGbk)
{
	int len = MultiByteToWideChar(CP_ACP, 0, strGbk.c_str(), -1, NULL, 0);
	wchar_t* wszUtf8 = new wchar_t[len + 1];
	memset(wszUtf8, 0, len * 2 + 2);
	MultiByteToWideChar(CP_ACP, 0, strGbk.c_str(), -1, wszUtf8, len);
	len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
	char* szUtf8 = new char[len + 1];
	memset(szUtf8, 0, len + 1);
	WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL, NULL);
	string strTemp(szUtf8);
	if (wszUtf8) delete[] wszUtf8;
	if (szUtf8) delete[] szUtf8;
	return strTemp;
}

std::string UTF8ToGBK(const std::string &strUtf)
{
	int len = MultiByteToWideChar(CP_UTF8, 0, strUtf.c_str(), -1, NULL, 0);
	wchar_t* wszGbk = new wchar_t[len + 1];
	memset(wszGbk, 0, len * 2 + 2);
	MultiByteToWideChar(CP_UTF8, 0, strUtf.c_str(), -1, wszGbk, len);
	len = WideCharToMultiByte(CP_ACP, 0, wszGbk, -1, NULL, 0, NULL, NULL);
	char* szgGbk = new char[len + 1];
	memset(szgGbk, 0, len + 1);
	WideCharToMultiByte(CP_ACP, 0, wszGbk, -1, szgGbk, len, NULL, NULL);
	string strTemp(szgGbk);
	if (wszGbk) delete[] wszGbk;
	if (szgGbk) delete[] szgGbk;
	return strTemp;
}


std::string QT_UTF8ToGBK(const std::string& strUtf)
{
	QTextCodec* utf8 = QTextCodec::codecForName("UTF-8");
	QTextCodec* gbk = QTextCodec::codecForName("GBK");
	QString strUnicode = utf8->toUnicode(strUtf.c_str());
	QByteArray gbkStr = gbk->fromUnicode(strUnicode);
	return gbkStr.toStdString();
}

std::string QT_Local8BitTo(const QString& qsSrt)
{
	std::string strTmp;
	QByteArray qBytTmp = qsSrt.toLocal8Bit();
	int iSzie = qBytTmp.size();
	if (iSzie <= 0)
	{
		return strTmp;
	}
	strTmp.resize(iSzie);
	memcpy(&strTmp[0], qBytTmp.data(), iSzie);

	return strTmp;
}

// 将 UTF-8 编码的 std::string 转为 std::wstring
std::wstring StringToWide(const std::string& str) {
    if (str.empty()) return L"";

    // 方法1:C++11(已弃用,但简单)
    #ifdef _WIN32
    // Windows 下用 Win32 API 更可靠
    int size = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, nullptr, 0);
    if (size == 0) return L"";
    std::wstring wstr(size, 0);
    MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, &wstr[0], size);
    return wstr;
    #else
    // Linux/macOS 使用 C++11(需编译器支持)
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    return converter.from_bytes(str);
    #endif
}

// 将 std::wstring 转为 UTF-8 编码的 std::string
std::string WideToString(const std::wstring& wstr) {
    if (wstr.empty()) return "";

    // 方法1:C++11(已弃用,但简单)
    #ifdef _WIN32
    // Windows 下用 Win32 API 更可靠
    int size = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);
    if (size == 0) return "";
    std::string str(size, 0);
    WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &str[0], size, nullptr, nullptr);
    return str;
    #else
    // Linux/macOS 使用 C++11(需编译器支持)
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    return converter.to_bytes(wstr);
    #endif
}

转自http://blog.youkuaiyun.com/seven407/article/details/7712823

UNICODE GBK UTF-8 编码互转(VC++) 1:UNICODE和GBK互转 wstring MBytesToWString(const char *lpcszString) { int len = strlen(lpcszString); int unicodeLen = ::MultiByteToWideChar(CP_ACP, 0, lpcszString, - 1, NULL, 0); wchar_t *pUnicode = 阅读详情

相关推荐

中文编码转换实践指南

GB2312是中国国家标准简体中文字符集的编码,它是对汉字编码的第一次统一规范,也是后来GBK、GB18030编码的基础。GB2312的编码方式使用了区位码来标识每一个汉字,共分为94个区,每个区94个位,每个字符占用两个字节。Windows操作系统提供了一系列的API函数,这些函数为开发者处理文本提供了强大的支持。在字符编码转换的上下文中,有几个关键的API函数需要了解::将多字节字符字符串转换为宽字符(Unicode)字符串。:将宽字符(Unicode)字符串转换为多字节字符字符串。

weixin_35732273的博客 441

宽字符、多字节、unicode、utf-8、gbk编码转化

今天遇到一个编码的问题,困惑了我很长时间,所以就简要的的了解了一下常用的编码类型。 我们最常见的是assic编码,它是一种单字节编码,对多容纳256个字符。 我们在编程的时候经常遇到unicode,unicode是一种宽字节编码,能够很好的融合世界各个国家的字符,具有国际通用性,所谓宽字符其实使用两个字节来表示一个符号。 而utf8是一种多字节编码,一个字符所占用的字节数不确定,是...

weixin_30399871的博客 326

VBS实现GB2312,UTF-8,Unicode,BIG5编码转换工具

VBS写的GB2312,UTF-8,Unicode,BIG5编码转换工具,转换工具下载:GB2Ue.vbs (3.34 kb)

MFC Unicode类型函数转化

(1)头文件 #pragma once class CStringUtil { public: /* *  int 转化为string */ static string IntToString(int iSour); /* *  string 转化为 wstring */ static std::wstring StringToWString(con

u011269801的专栏 1187

【iOS开发】dyld: Symbol not found: ___chkstk_darwin 问题解决

【iOS开发】dyld: Symbol not found: ___chkstk_darwin 问题解决 Xcode 13.2.1 运行到iOS12.x版本上崩溃报错如下:dyld: Symbol not found: ___chkstk_darwin dyld: Symbol not found: ___chkstk_darwin Referenced from: /private/var/containers/Bundle/Application/A424CEFD-51DB-450E-9D62-B8

wm9028的专栏 6563

STM32H750xx【QSPI】轮询方式读写GD25Q64E

本文详细介绍了GD25Q64E其特性、引脚定义及功能说明,重点阐述了在STM32H750平台上通过CubeMX配置QuadSPI接口的步骤,包括时钟设置、参数优化等。文章提供了完整的BSP驱动开发流程,涵盖写使能、四线模式使能、ID读取、解除保护、扇区擦除、整片擦除、页编程和数据读取等关键功能实现,并通过读写测试验证了DummyCycles参数对数据准确性的影响。

honmy18的博客 1422

MFC中 GB2312、UTF-8、unicode 之间转换

//GB2312到UTF-8的转换 static int GB2312ToUtf8(const char* gb2312, char* utf8) { int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0); wchar_t* wstr = new wchar_t[len+1]; memset(wstr, 0, len+

seven407的专栏 4214

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下...

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下 CT Image with Window presets This is an example of displaying a ct image along with buttons to set ww/wc pres...

浩秦的博客 1841

转 MFC中 GB2312、UTF-8、unicode 之间转换

//GB2312到UTF-8的转换static int GB2312ToUtf8(const char* gb2312, char* utf8){int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);wchar_t* wstr = new wchar_t[len+1];memset(wstr, 0, len+1);MultiBy...

weixin_34082695的博客 245

Voxel Hashing技术解析:如何解决TSDF内存爆炸问题?

本文深入解析Voxel Hashing技术如何有效解决TSDF内存爆炸问题。通过动态内存分配和空间哈希函数设计,该技术将内存占用降低96.6%,同时保持高精度重建。文章详细介绍了GPU加速实现、现代系统演进及实践指南,为实时3D重建提供工程解决方案。

m2n3b4v5c6的博客 713

LobeHub开源AI应用平台:从部署到定制的全栈实践指南

在现代AI应用开发领域,大语言模型(LLM)的集成与部署是核心技术挑战之一。其原理在于通过API或本地化部署,将预训练模型的强大能力封装为可调用的服务。这项技术的核心价值在于极大地降低了AI应用的开发门槛,使开发者能够快速构建智能对话、内容生成等场景的应用。随着模型即服务(MaaS)模式的普及,一个关键痛点是如何高效地管理多模型、设计友好的用户界面并实现功能扩展。这正是开源项目LobeHub所聚焦的领域,它通过提供可插拔的架构和配置驱动的低代码理念,解决了AI能力落地的“最后一公里”问题。本文将结合Dock

weixin_27210125的博客 753

mfc 中文乱码转换为正常中文_中文编码转换

中文编码转换——6种编码30个方向的转换1.问题提出在学编程序时,曾经有人问过“你可以编一个记事本程序吗?”当时很不屑一顾,但是随着学习MFC的深入,了解到记事本程序也并非易事,难点就是四种编码之间的转换。对于编码,这是一个令初学者头疼的问题,特别是对于编码的转换,更是难以捉摸。笔者为了完成毕业设计中的一个编码转换模块,研究了中文编码和常见的字符集后,决定解决"记事本"程序的编码问题,更进一步完成...

weixin_39870664的博客 1096

工业相机与ABB机器人Socket通信实战:手把手教你用RobotStudio 6.08搭建视觉引导工作站

本文详细介绍了工业相机与ABB机器人通过Socket通信实现视觉引导工作站的实战教程。使用RobotStudio 6.08平台,涵盖工作站搭建、坐标系标定、RAPID代码开发及TCP/IP通信配置,特别解析了欧拉角与四元数转换等关键技术难点,助力智能制造产线升级。

weixin_42531516的博客 407

如何把UTF-8转为GB2312的

目前很多的中文网页都采用UTF-8或GB2312编码,UTF-8和GB2312都是字符集的编码,具体格式这里不做讨论,这里主要是看看如何用把UTF-8转为GB2312的。在vc的开发平台里UTF-8汉字会显示成乱码,需要转换成GB2312才能显示。 大概的思路是这样的,先把UTF8转换成UNICODE,再把UNICODE转换成GB2312,为什么会这样想呢,因为windows API里提供了多字

zhangxf0521的专栏 2065

一桶令牌的时间账本:四类限流算法的边界推演与Guava RateLimiter源码精读

限流的难点不在背出算法名,而在算清每一笔账:按哪一秒计数、超额请求排队还是拒绝、空闲后能否突发、集群总量如何约束。本文在可复现的虚拟时间实验台上对比固定窗口、滑动窗口、漏桶与令牌桶,实测边界双倍突发与分桶滑动的真实上界,拆解Nginx limit_req的千分位记账与延迟机制,纠正Resilience4j常被误称漏桶的说法,并逐行精读Guava SmoothRateLimiter的预消费、懒惰补账与预热积分,复刻迷你限流器与其完成七万次零差异对账,最后给出集群配额、分层防护与参数确定的方法。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 86万+

YOLO11改进|注意力机制篇|引入ELA注意力机制

YOLO11添加ELA注意力机制

A1983Z的博客 3647

VC++版 Unicode ANSI UTF-8 GB2312 相互转换代码

void AnsiToUnicode(char *szAnsi,WCHAR * szWs) { //必须保证szWs有足够的空间 int len = ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0); ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(

xiao628945的专栏 808

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

UTF-8/UNICODE/简体中文/繁体中文之间的转换

简介 这几天一直在研究中文的简体和繁体之间的转换问题,网上查了一下资料,在此进行整理和备份。 繁体中文有GBK码和BIG5码两种编码,简体中文一般使用的是GB2312编码。 这些编码之间的转换基本都是使用下列3个函数:LCMapString、WideCharToMultiByte和MultiByteToWideChar,其中还会牵涉到UNICODE码和UTF-8码这两种编码。 GB2312...

weixin_30338743的博客 1999

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Unicode和UTF-8之间的转换

通过这几天的研究,终于明白了Unicode和UTF-8之间编码的区别。Unicode是一个字符集,而UTF-8是Unicode的其中一种,Unicode是定长的都为双字节,而UTF-8是可变的,对于汉字来说Unicode占有的字节比UTF-8占用的字节少1个字节。Unicode为双字节,而UTF-8中汉字占三个字节。 注: Unicode编码目前规划的总空间是17个平面,0x0000 至 0x1...

千月星跡 698

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Unicode UTF-8 Ansi 互转及MultiByteToWideChar和WideCharToMultiByte用法等编码相关

Unicode UTF-8 Ansi 互转及MultiByteToWideChar和WideCharToMultiByte用法等编码相关 分类: MFC/SDK/C++2010-05-18 20:53 2818人阅读 评论(1) 收藏 举报 目录(?)[+] Unicode,到UTF-8。   [cpp] view plainc

pirate97的专栏 7860

字符编码 Unicode UTF-8,GB2312,shift-jis编码判断。

字符串编码判断;Unicode,UTF-8之间编码 2008-07-18 10:11 Unicode和UTF-8之间编码的区别Unicode是一个字符集,而UTF-8是Unicode的其中一种,Unicode是定长的都为双字节,而UTF-8是可变的,对于汉字来说Unicode占有的字节比UTF-8占用的字节少1个字节Unicode为双字节,而UTF-8中汉字占三个字节

a904003695的专栏 2619

从GB2312到Unicode转换表制作

简体中文有两种常用编码:GB2312 和 Unicode. 它们的对应关系可以用下面的程式所生成:/**  * GB2312Unicde.java  * Copyright (c) 2003 by Dr. Herong Yang, http://www.herongyang.com/  */ import java.io.*; import java.nio.*; import java.ni

风流浪子的专栏 1670

UTF-8, Unicode, GB2312格式串转换之C语言版

这几天工作上碰到了UTF-8转GB2312的问题,而且是在嵌入式的环境下,没有API可用,查了很多网上的资料,大多调用VC或者linux下自带的接口。在这里我将这两天的工作做个总结。       总的来说分为两大步(这里就不介绍基础知识了):       一、UTF8 -> Unicode       由于UTF8和Unicode存在着联系,所以不需要任何库就可以直接进行转换。首先要看懂

sishuirensheng66的专栏 530

c/c++ CString 转码编码解码

模拟登陆和注册账户少不了要用到编码解码转码,下面是我网上找的然后自己修改成CString函数,方便MFC环境下调用 另外有不能用的函数替换修改了。 void ConvertGBKToUtf8(CString& strGBK); void ConvertUtf8ToGBK(CString& strUtf8); // 转码 CString UTF_8ToGB2312(CS

kupig的专栏 3472
上一篇: MFC CMFCToolBar静态工具栏和动态工具栏,加载自定义图片(真彩透明)
下一篇: 生活需要目标,学习也一样。
零隐
博客等级 码龄17年 16粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值