C++ 解决std::string字符串显示中文乱码的问题

42 篇文章 72 订阅 ¥19.90 ¥99.00
9 篇文章 8 订阅 ¥9.90 ¥99.00

一、问题描述

在打印包含汉字的std::string时,出现中文显示乱码的问题,而将内容保存到notepad++ Utf-8格式的文本中却显示正常。解决方法见章节2.1。

二、代码示例

2.1 解决方法

#include<string>
using namespace std;

std::string string_To_UTF8(const std::string & str)
{
   
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++中,std::string默认使用的是ASCII编码,而中文字符是Unicode编码,因此在使用std::string存储中文字符时,可能会出现乱码的情况。为了避免这种情况,可以使用std::wstring来存储中文字符,或者使用第三方库进行编码转换。下面是一个使用第三方库iconv进行编码转换的例子: ```c++ #include <iostream> #include <string> #include <iconv.h> int main() { std::string str = "中文字符"; std::string from_charset = "UTF-8"; std::string to_charset = "GBK"; iconv_t cd = iconv_open(to_charset.c_str(), from_charset.c_str()); if (cd == (iconv_t)-1) { std::cerr << "iconv_open failed" << std::endl; return 1; } char *inbuf = const_cast<char *>(str.c_str()); size_t inbytesleft = str.length(); size_t outbytesleft = inbytesleft * 2; char *outbuf = new char[outbytesleft]; char *outbuf_start = outbuf; if (iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft) == (size_t)-1) { std::cerr << "iconv failed" << std::endl; return 1; } std::string result(outbuf_start, outbuf - outbuf_start); std::cout << result << std::endl; delete[] outbuf; iconv_close(cd); return 0; } ``` 上述代码中,我们使用了iconv库进行编码转换。首先,我们定义了一个std::string类型的字符串str,其中包含中文字符。然后,我们定义了两个std::string类型的变量from_charset和to_charset,分别表示源编码和目标编码。在本例中,源编码为UTF-8,目标编码为GBK。接下来,我们调用iconv_open函数打开一个iconv转换句柄。如果打开失败,我们将输出错误信息并返回1。然后,我们定义了输入缓冲区inbuf、输入缓冲区剩余字节数inbytesleft、输出缓冲区outbuf、输出缓冲区剩余字节数outbytesleft。接着,我们调用iconv函数进行编码转换。如果转换失败,我们将输出错误信息并返回1。最后,我们将输出转换后的结果,并释放内存和关闭iconv转换句柄。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的小豆芽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值