OS X操作系统中,函数wcsrtombs在Qt应用程序中会失败

ken_scott 2017-02-06 12:42:03

#include <errno.h>
#include <clocale>
#include <string>
#include <iostream>

static void locale_init()
{
static bool initialized = false;
if (!initialized)
{
std::setlocale(LC_CTYPE, "");
initialized = true;
}
}

static bool unicode_to_ansi(const wchar_t * unicode_str, std::string & ansi_str)
{
ansi_str.clear();

if (nullptr == unicode_str || L'\0' == unicode_str[0])
{
return(true);
}

locale_init();
std::mbstate_t mbstate = std::mbstate_t();
std::size_t bytes_count = std::wcsrtombs(nullptr, &unicode_str, 0, &mbstate);
if (static_cast<std::size_t>(-1) == bytes_count)
{
return(false);
}
else if (0 != bytes_count)
{
ansi_str.resize(bytes_count);
std::wcsrtombs(&ansi_str[0], &unicode_str, bytes_count, &mbstate);
}

return(true);
}

static void test()
{
std::wstring unicode_test = L"中文";
std::string ansi_test;
errno = 0;
if (unicode_to_ansi(unicode_test.c_str(), ansi_test))
{
std::cout << "ok" << std::endl;
std::cout << "ansi: " << ansi_test << std::endl;
}
else
{
std::cout << "errno:" << errno << std::endl;
perror("");
}
}


只在Mac操作系统下有问题:

如果,test()在控制台等程序中调用,显示
ok
中文

但如果,在Qt程序中调用,显示:
errno:92
Illegal byte sequence

但我看过不同程序下unicode_test变量的每个字节都是一样的
...全文
197 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ken_scott 2017-02-14
  • 打赏
  • 举报
回复
嗯,先结贴了,怕忘记
赵4老师 2017-02-07
  • 打赏
  • 举报
回复
先参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\cvt\*.* 再将其移植到Mac+Qt环境下?
ken_scott 2017-02-07
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
说明Qt系统对Mac的支持不到位或者你没有设置好相关参数。
估计是和Qt的某项设置冲突了,使得std::setlocale(LC_CTYPE, "");这句没起作用
赵4老师 2017-02-07
  • 打赏
  • 举报
回复
引用 4 楼 ken_scott 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] 先参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\cvt\*.* 再将其移植到Mac+Qt环境下?
Mac下,如果是在控制台程序下,编码正常,如果是Qt程序,就不行 Ubuntu和CentOS下,不过是不是Qt程序,都可以[/quote] 说明Qt系统对Mac的支持不到位或者你没有设置好相关参数。
ken_scott 2017-02-07
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
先参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\cvt\*.* 再将其移植到Mac+Qt环境下?
Mac下,如果是在控制台程序下,编码正常,如果是Qt程序,就不行 Ubuntu和CentOS下,不过是不是Qt程序,都可以
ken_scott 2017-02-06
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
换wcout ?
输出只是演示,是字符转码失败(Mac+Qt环境下才会)
赵4老师 2017-02-06
  • 打赏
  • 举报
回复
换wcout ?
本课程《华为物联网操作系统LiteOS》是朱老师物联网大讲堂推出的一套物联网理论和实践相结合的视频课程。本课程以渐次递进的方式讲了以下4个主题。主题1:物联网,这是整个课程第1部分。主要讲了物联网的概念、发展历程、物联网的典型案例和应用场景,从技术角度深度阐述了物联网的4层架构、分析了各层次的核心技术和实现原理。本部分的主要目的是让大家对物联网有一定深度和专业性的理解。很多人一直对物联网有兴趣,也找了不少资料看了不少书,但是越看越糊涂,尤其很多物联网专业的大学生,经过几年的大学学习仍然不知道究竟什么是物联网,更不知该如何去学习物联网,本部分就是为解决这个疑问而生。主题2:操作系统,这是整个课程第2部分。主要讲了操作系统的基本原理,操作系统的作用和组成部分,让我们明白裸机开发和基于操作系统的开发有什么差异。这部分是比较偏理论的,是为了解决很多同学对操作系统的认知基础的。很多同学甚至是开发者,尤其是单片机的开发者习惯了裸机开发,直接基于寄存器或者官方库函数(譬如stm32的HAL库、标准库)的开发,心里很疑惑到底什么是操作系统,为什么裸机开发也能做项目还需要操作系统?用不用操作系统的差异在哪里?为什么要去学习操作系统?应该如何学习操作系统?本部分就是为了回答这些问题。主题3:物联网操作系统,这是整个课程的的3部分。物联网操作系统是专为物联网而研发和设计的操作系统,是物联网设备的核心技术。物联网操作系统也是一种操作系统,他具有操作系统的普遍特性(以前前面我们才先学习泛性的普遍的操作系统),但是物联网操作系统有它很多独特的特性,华为的LiteOS就是一款非常典型的优秀的物联网操作系统,除此之外国内还有诸如RT-Thread、AliOSThings等其他优秀物联网操作系统,国外还有Amazon的Freertos等物联网操作系统。那究竟物联网操作系统有什么特别之处?物联网产品如何选择操作系统?如何基于操作系统来开发物联网产品?本部分课程将回答这些问题。主题4:华为物联网操作系统LiteOS,这是整个课程的第4部分。本部分聚焦LiteOS,基于前3部分的铺垫,向大家详细讲解LiteOS的设计思路,专门安排了2大章节来详细分析LiteOS的kernel源码和周边组件源码,还介绍了我们专为学习物联网而设计的NB476开发板,且基于该开发板和LiteOS设计了一个温湿度和断电检测报警器的典型的物联网产品试验,在试验实战让大家体会基于LiteOS的物联网项目的开发方式。本部分是整个课程最重头戏的部分,篇幅占据整个课程的一半左右。因此实际上我们整个课程的内容还是比较偏技术性的,可谓低走高开。从基础概念起步,最终带大家能够去做产品。课程特色*完全零基础,降低学习门槛。*深入浅出,通俗易懂。不怕学不会,就怕你不学习。*思路清晰、语言风趣,对着视频看也不会想睡觉······*视频 + 文档 + 练习题 + 答疑,全方位保证学习质量。*基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。*系列课程。本教程只是入门篇,后续还有更多更精彩视频更新
HarmonyOS操作系统的发布迅速在国内兴起一股学习、研究操作系统的热潮,它带来的全新设计理念令人耳目一新:全新的分布式流转用户体验,一套OS就可支持差异巨大的设备形态,应用只需一次开发便可在不同终端设备上运行。如何才能深入理解这些理念背后的设计逻辑?如何在庞杂的技术体系抓住核心要领而不至于迷失方向?本书系统、全面的对HarmonyOS操作系统进行了深入浅出的分析,让您理清基本概念,徜徉在HarmonyOS的知识海洋。不管你是热情高涨的新手,还是沉稳老练的行家,无论你是北向的应用开发者,还是南向的设备开发者,或是意在HarmonyOS社区一展身手的高手,我都向您隆重推荐这本书。如果我的书架有几本HarmonyOS的书籍,《鸿蒙操作系统入门经典》我希望其一本就是它。---任革林,华为HarmonyOS系统架构师   本套课程在我的鸿蒙开发书《鸿蒙操作系统入门经典》的基础上,增加了完整视频讲解,通过大量案例让学习者掌握鸿蒙的基础知识的同时,掌握鸿蒙的应用开发技巧。    本套课程由华为授权的 Huawei Developer Experts ,华为授权鸿蒙课程讲师,华为首届鸿蒙开发者创新大赛导师、华为学堂认证讲师亲授。   华为开发专家 Huawei Developer Experts  华为授权鸿蒙课程讲师

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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